Mysql查询将总天数转换为年,月和日

时间:2015-01-13 18:52:37

标签: mysql date

我需要使用mysql查询将总天数转换为年,月和日格式。

我目前的代码就是这个:

SELECT  nombre, fecha_de_inicio, DATEDIFF(NOW(), fecha_de_inicio) as days_employed
FROM    cms_trabajadores 
GROUP   BY days_employed desc

现在结果就像这样(3列):

名称开始日期和days_employed

Aaron,2007-06-25 00:00:00,2759

第一列是其名称,第二列是开始日期,第三列是最后一列。

我希望总工作时间如下:

7年,6个月和21天

提前感谢您的帮助。

我的桌子上有开始日期,而且我总是与当天比较。

1 个答案:

答案 0 :(得分:0)

#UPDATE - 1:

经过一些更正后,以下查询给出了您按预期标记的确切结果:

SELECT  DISTINCT
    nombre, 
    fecha_de_inicio, 
    FLOOR(PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) / 12) as years_employed, 
    PERIOD_DIFF(DATE_FORMAT(DATE_ADD((CASE WHEN DAY(NOW()) >= DAY(fecha_de_inicio) THEN NOW() ELSE DATE_ADD(NOW(), INTERVAL -1 MONTH) END), INTERVAL -(FLOOR(PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) / 12)) YEAR), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) as months_employed,
    DATEDIFF(NOW(), fecha_de_inicio) - DATEDIFF(DATE_ADD(CONVERT(CONCAT(DATE_FORMAT((CASE WHEN DAY(NOW()) >= DAY(fecha_de_inicio) THEN NOW() ELSE DATE_ADD(NOW(), INTERVAL -1 MONTH) END), '%Y-%m-'), RIGHT('0' + DAY(fecha_de_inicio), 2)), DATE), INTERVAL -1 DAY), fecha_de_inicio) as days_employed
FROM    
    cms_trabajadores 
ORDER BY 
    years_employed desc, 
    months_employed desc, 
    days_employed desc

列计算说明:

  • years_employed FLOOR(PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) / 12) - 当前日期和就业日期之间的年数差异计算为月份差异除以12且剩余剩余时间

  • months_employed PERIOD_DIFF(DATE_FORMAT(DATE_ADD((CASE WHEN DAY(NOW()) >= DAY(fecha_de_inicio) THEN NOW() ELSE DATE_ADD(NOW(), INTERVAL -1 MONTH) END), INTERVAL -(FLOOR(PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) / 12)) YEAR), '%Y%m'), DATE_FORMAT(fecha_de_inicio, '%Y%m')) - 在此处,使用PERIOD_DIFF功能,仅在NOW() 的前1个月内计算差异如果 DAY(NOW()) < DAY(fecha_de_inicio),则减去年数差异,然后在减法产品和DATEDIFF之间制作fecha_de_inicio;这应该得到剩余月份

  • days_employed DATEDIFF(NOW(), fecha_de_inicio) - DATEDIFF(DATE_ADD(CONVERT(CONCAT(DATE_FORMAT((CASE WHEN DAY(NOW()) >= DAY(fecha_de_inicio) THEN NOW() ELSE DATE_ADD(NOW(), INTERVAL -1 MONTH) END), '%Y-%m-'), RIGHT('0' + DAY(fecha_de_inicio), 2)), DATE), INTERVAL -1 DAY), fecha_de_inicio) - 此值仅在NOW() 的前1个月减去,仅当 DAY(NOW()) < DAY(fecha_de_inicio)时,然后使用DATE_FORMAT建立新日期,从第一步(条件-1月步骤)准备的NOW()中取出年份和月份,并从fecha_de_inicio减去日,然后减去1天。如果天数实际上是NOW()fecha_de_inicio之间的月份差异,但是转换为天数,我们会从这两个日期之间的DATEDIFF(NOW(), fecha_de_inicio)严格差异中减去此值。这给了我们剩余的日子

我希望它可能会有所帮助。如有疑问,请写信。