将整个列从 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;

更多信息:ALTER TABLE and Generated Columns