将整个列从 YYYY-MM-DD 更改为 MySQL 中的月数
Changing an entire column from YYYY-MM-DD to number of months in MySQL
假设您在 MySQL 中有一个完整的列,即 YYYY-MM-DD,并且您想要 select 它作为到特定日期的月数,并且也将其作为一个新专栏。计算到的示例日期可以是 2020 年 3 月。
所以如下(table_1):
Emp_Name
Hire_Date
Steve
2018-03-28
到
Emp_Name
Months_Employed
Steve
24
但对 Hire_Date 列中的每个日期执行此操作,而无需在 DATEDIFF 或 TIMESTAMPDIFF 中手动输入开始和结束日期。
我有以下内容,其中 returns 一个新列,但具有 NULL 值:
select
Emp_Name, timestampdiff(month, 2021-04-01, Hire_Date) as Months_Employed
from
table_1
我也试过 DATEDIFF 和除以 12 但它不起作用。
感谢任何帮助。
编辑有效答案:
SELECT
emp_name,
TIMESTAMPDIFF(month, hire_date, '2022-03-07')
AS months_employed
FROM table_1
DATEDIFF
函数returns天数的差异。如果你想要月数,你需要将这个数字除以30(假设一个月平均有30天)。
由于您的输出为 NULL,可能 Hire_Date
类型存在问题,因此我会将 Hire_Date
的值 CAST
转换为 DATE
类型。
SELECT
Emp_Name,
DATEDIFF(
CAST('2021-04-01' AS DATE),
CAST(Hire_Date AS DATE)
)/30 AS Months_Employed
FROM
table_1
对你有用吗?
TIMESTAMPDIFF(MONTH, startDate, endDate) 是正确的函数。
日期常量需要显示为文本字符串。 '2021-04-01'
是 2021 年愚人节。但是 2021-04-01
没有引号,是一个计算结果为 2016
.
的算术表达式
这里是 fiddle。
SELECT emp_name,
hire_date,
TIMESTAMPDIFF(MONTH, hire_date, '2022-03-07')
FROM table_1
有一个 mysql 函数可以让您通过传递年份和月份来实现这一点。
PERIOD_DIFF(P1,P2) - Returns P1 和 P2 之间的月数。 P1 和 P2 的格式应为 YYMM 或 YYYYMM。请注意,期间参数 P1 和 P2 不是日期值。
SELECT PERIOD_DIFF(200802,200703);
-> 11
SELECT emp_name,
PERIOD_DIFF
(
202104,
DATE_FORMAT(hire_date,"%Y%m")
) AS "Months_Employed"
FROM employees;
您可以使用此查询中的功能添加生成的列:
select d,timestampdiff(month,'2020-03-01',d) X from dates where day(d)=1 and year(d)<=2020;
输出:
d
X
2020-01-01
-2
2020-02-01
-1
2020-03-01
0
2020-04-01
1
2020-05-01
2
2020-06-01
3
...
...
在你的情况下是这样的:
alter table table_1
modify column Months_Employed integer
generated always as (timestampdiff(month,'2020-03-01',Hire_Date)) stored;
假设您在 MySQL 中有一个完整的列,即 YYYY-MM-DD,并且您想要 select 它作为到特定日期的月数,并且也将其作为一个新专栏。计算到的示例日期可以是 2020 年 3 月。
所以如下(table_1):
Emp_Name | Hire_Date |
---|---|
Steve | 2018-03-28 |
到
Emp_Name | Months_Employed |
---|---|
Steve | 24 |
但对 Hire_Date 列中的每个日期执行此操作,而无需在 DATEDIFF 或 TIMESTAMPDIFF 中手动输入开始和结束日期。
我有以下内容,其中 returns 一个新列,但具有 NULL 值:
select
Emp_Name, timestampdiff(month, 2021-04-01, Hire_Date) as Months_Employed
from
table_1
我也试过 DATEDIFF 和除以 12 但它不起作用。
感谢任何帮助。
编辑有效答案:
SELECT
emp_name,
TIMESTAMPDIFF(month, hire_date, '2022-03-07')
AS months_employed
FROM table_1
DATEDIFF
函数returns天数的差异。如果你想要月数,你需要将这个数字除以30(假设一个月平均有30天)。
由于您的输出为 NULL,可能 Hire_Date
类型存在问题,因此我会将 Hire_Date
的值 CAST
转换为 DATE
类型。
SELECT
Emp_Name,
DATEDIFF(
CAST('2021-04-01' AS DATE),
CAST(Hire_Date AS DATE)
)/30 AS Months_Employed
FROM
table_1
对你有用吗?
TIMESTAMPDIFF(MONTH, startDate, endDate) 是正确的函数。
日期常量需要显示为文本字符串。 '2021-04-01'
是 2021 年愚人节。但是 2021-04-01
没有引号,是一个计算结果为 2016
.
这里是 fiddle。
SELECT emp_name,
hire_date,
TIMESTAMPDIFF(MONTH, hire_date, '2022-03-07')
FROM table_1
有一个 mysql 函数可以让您通过传递年份和月份来实现这一点。 PERIOD_DIFF(P1,P2) - Returns P1 和 P2 之间的月数。 P1 和 P2 的格式应为 YYMM 或 YYYYMM。请注意,期间参数 P1 和 P2 不是日期值。
SELECT PERIOD_DIFF(200802,200703);
-> 11
SELECT emp_name,
PERIOD_DIFF
(
202104,
DATE_FORMAT(hire_date,"%Y%m")
) AS "Months_Employed"
FROM employees;
您可以使用此查询中的功能添加生成的列:
select d,timestampdiff(month,'2020-03-01',d) X from dates where day(d)=1 and year(d)<=2020;
输出:
d | X |
---|---|
2020-01-01 | -2 |
2020-02-01 | -1 |
2020-03-01 | 0 |
2020-04-01 | 1 |
2020-05-01 | 2 |
2020-06-01 | 3 |
... | ... |
在你的情况下是这样的:
alter table table_1
modify column Months_Employed integer
generated always as (timestampdiff(month,'2020-03-01',Hire_Date)) stored;