如何在MySQL中计算日期差异

时间:2014-04-18 21:40:40

标签: mysql

我有下表:

|    ID |          HIRE_DATE |     PROMOTION_DATE |
|-------|-----------------------------------------|
| 10008 |      June, 12 1989 |   October, 15 2012 |
| 10021 |      June, 21 1999 |   October, 01 2012 |
| 10021 |      June, 21 1999 |  December, 27 2010 |
| 10029 |      June, 29 2007 |      June, 10 2013 |
| 10029 |      June, 29 2007 |      July, 01 2009 |
| 10058 | September, 12 1983 |       May, 31 2010 |
| 10100 | September, 20 1999 |  November, 14 2011 |
| 10101 |     April, 24 2006 |     March, 05 2012 |
| 10101 |     April, 24 2006 |      July, 01 2006 |
| 10122 |      July, 25 2005 |     March, 05 2012 |
| 10122 |      July, 25 2005 | September, 01 2009 |
| 10163 |      July, 06 2004 |      June, 14 2010 |
| 10163 |      July, 06 2004 |      July, 01 2007 |
| 10251 |      June, 06 1994 |     April, 01 2008 |
| 10279 | September, 01 2000 |  December, 01 2007 |
| 10320 |      July, 19 2004 | September, 19 2011 |
| 10320 |      July, 19 2004 |  December, 01 2009 |
| 10320 |      July, 19 2004 |   October, 01 2007 |

我想计算某人获得促销所需的时间。因此,对于第一人称10008,促销时间将是2012年10月15日到1989年6月12日的雇用日期之间的时间。

第二人有2个促销活动,因此第一次促销的促销时间将是2010年12月27日至1999年6月21日之间的差异;第二次促销将是2012年10月1日至2010年12月27日之间的差异。

我可以在Excel中执行此操作,但不知道如何在MySQL中执行此操作。 Excel无法处理大型数据集,因此在Excel中执行计算时会变得很麻烦。

以下是我想要的结果:

|    ID |          HIRE_DATE |     PROMOTION_DATE | PROMOTION_TIME (year)
-------------------------------------------------------------------|
| 10008 |      June, 12 1989 |   October, 15 2012 |             23 |
| 10021 |      June, 21 1999 |   October, 01 2012 |              2 |
| 10021 |      June, 21 1999 |  December, 27 2010 |             12 |
| 10029 |      June, 29 2007 |      June, 10 2013 |              4 |
| 10029 |      June, 29 2007 |      July, 01 2009 |              2 |
| 10058 | September, 12 1983 |       May, 31 2010 |             27 |
| 10100 | September, 20 1999 |  November, 14 2011 |             12 |
| 10101 |     April, 24 2006 |     March, 05 2012 |              6 |
| 10101 |     April, 24 2006 |      July, 01 2006 |              0 |
| 10122 |      July, 25 2005 |     March, 05 2012 |              3 |
| 10122 |      July, 25 2005 | September, 01 2009 |              4 |
| 10163 |      July, 06 2004 |      June, 14 2010 |              3 |
| 10163 |      July, 06 2004 |      July, 01 2007 |              3 |
| 10251 |      June, 06 1994 |     April, 01 2008 |             14 |
| 10279 | September, 01 2000 |  December, 01 2007 |              7 |
| 10320 |      July, 19 2004 | September, 19 2011 |              2 |
| 10320 |      July, 19 2004 |  December, 01 2009 |              2 |
| 10320 |      July, 19 2004 |   October, 01 2007 |              3 |

有人可以帮忙吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

这有点痛苦,因为MySQL不支持lag()功能。您可以使用相关子查询来执行此操作。所以:

select id, hire_date, promotion_date,
       datediff(promotion_date, coalesce(prev_promotion_date, hire_date)) as days
from (select t.*,
             (select max(promotion_date)
              from table t2
              where t2.id = t.id and
                    t2.promotion_date < t.promotion_date
             ) as prev_promotion_date
      from table t
     ) t

如果你希望价值为年,我只想除以365.25,并让它足够接近。我需要更高的准确度,您可以查看this