【问题标题】:How to get the difference in years from two different dates?如何从两个不同的日期获得年份差异?
【发布时间】:2011-10-13 05:00:20
【问题描述】:

我想使用 MySQL 数据库获取两个不同日期的年份差异。

例如:

  • 2011-07-20 - 2011-07-18 => 0 年
  • 2011-07-20 - 2010-07-20 => 1 年
  • 2011-06-15 - 2008-04-11 => 2 3 年
  • 2011-06-11 - 2001-10-11 => 9 年

SQL 语法怎么样?是否有任何来自 MySQL 的内置函数来产生结果?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这也是闰年的表达方式:

    YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))
    

    这是有效的,因为表达式(DATE_FORMAT(date1, '%m%d') &lt; DATE_FORMAT(date2, '%m%d'))true,如果 date1 比 date2“更早”并且因为在 mysql 中,true = 1false = 0,所以调整是只是减去比较的“真相”。

    这为您的测试用例提供了正确的值,除了测试 #3 - 我认为它应该是“3”以与测试 #1 保持一致:

    create table so7749639 (date1 date, date2 date);
    insert into so7749639 values
    ('2011-07-20', '2011-07-18'),
    ('2011-07-20', '2010-07-20'),
    ('2011-06-15', '2008-04-11'),
    ('2011-06-11', '2001-10-11'),
    ('2007-07-20', '2004-07-20');
    select date1, date2,
    YEAR(date1) - YEAR(date2)
        - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) as diff_years
    from so7749639;
    

    输出:

    +------------+------------+------------+
    | date1      | date2      | diff_years |
    +------------+------------+------------+
    | 2011-07-20 | 2011-07-18 |          0 |
    | 2011-07-20 | 2010-07-20 |          1 |
    | 2011-06-15 | 2008-04-11 |          3 |
    | 2011-06-11 | 2001-10-11 |          9 |
    | 2007-07-20 | 2004-07-20 |          3 |
    +------------+------------+------------+
    

    SQLFiddle

    【讨论】:

    • 非常感谢您的回复。对于#3 测试用例,它应该是 3 年。我有另一个测试用例(闰年):2007-07-20 - 2004-07-20 => 3 年,但结果仍然是 2 年。
    • @aslingga 没问题。我已经改进了解决方案,因此它现在适用于您的所有测试,包括闰年问题。
    • 嘿,我能够达到上述结果,但我的条件是我需要 0.5 年、1 年、1.5 年、2 年、2.5 年等等......我怎么能这样做!!
    • @dipen 这是一个不同的问题,所以问一个新问题。此外,此解决方案不能适用于返回分数年。
    【解决方案2】:

    我喜欢 Bohemian 的解决方案,但是如何使用 timestampdiff

    select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639
    

    sqlfiddle

    似乎更容易。

    【讨论】:

    • 这是最好/最简单的答案。
    【解决方案3】:
    mysql> SELECT FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365);
    +------------------------------------------------+
    | FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365) |
    +------------------------------------------------+
    |                                              9 |
    +------------------------------------------------+
    1 row in set (0.00 sec)
    

    DATEDIFF() 返回两个日期之间的天数差。这没有特别考虑闰年,但它可能适用于这种情况:

    mysql> SELECT FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365);
    +------------------------------------------------+
    | FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365) |
    +------------------------------------------------+
    |                                              3 |
    +------------------------------------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 询问者根本没有提到他们,所以我认为他不在乎。
    • 抱歉,我忘记添加闰年的测试用例了。
    【解决方案4】:

    只需:SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table

    【讨论】:

      【解决方案5】:

      你可以使用

      SELECT ROUND((TO_DAYS(date2) - TO_DAYS(date1)) / 365) ...
      

      如果你想要一个正数,也可以用ABS() 包裹它,不管哪个日期早于另一个。

      使用ROUND(),0.6 年将被视为 1 年,如果您只想计算整年,则可以使用 FLOOR()。在这种情况下,0.6 年将被视为 0 年,1.9 年将被视为 1 年。

      【讨论】:

      • 两次都应该是 TO_DAYS。我无法编辑它,因为编辑必须 >=6 个符号。请更正
      【解决方案6】:

      date1 和 date2 之间的年数:

      IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < 
      MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + 
      (MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))
      

      现在介绍一些关于这些的cmets。

      1. 这些结果返回整数年、月和日。他们是“地板”。因此,1.4 天将显示为 1 天,13.9 年将显示为 13 年。同样,-1.4 年将显示为 -1 年,-13.9 个月将显示为 -13 个月。

      2. 请注意,我在很多情况下都使用布尔表达式。因为布尔表达式的计算结果为 0 或 1,所以我可以使用它们根据条件从总数中减去或加 1。

      【讨论】:

        【解决方案7】:

        这很好用,即使考虑到闰年:

        select floor((cast(date_format('2016-02-14','%Y%m%d') as int) - cast(date_format('1966-02-15','%Y%m%d') as int)/10000);
        

        将下限保留为小数在大多数情况下都是不正确的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多