【问题标题】:Subtracting a year with DATEADD doesn't handle leap years correctly用 DATEADD 减去一年不能正确处理闰年
【发布时间】:2013-05-07 09:50:42
【问题描述】:

当从当前日期减去年份时,如果当前日期是February 28 2013,则下面的语句返回February 28 2012,但正确结果应该是February 29 2012,因为2012年是一个飞跃 年。这种情况如何处理。

SELECT DATEADD(year, -1, GETDATE())

【问题讨论】:

  • 2 月 29 日是否正确结果是一个解释问题。
  • 正如 Pekka 所说,这是一个解释问题。现在,如果你想要一个月的最后一天,那就另当别论了……
  • 是的。你想要一年前一个月的最后一天、365 天前的那一天,还是 365/366 天前的日期,这取决于是否有闰日?
  • 不管怎样,这对于在 MySQL 中“推山”来说将是相对复杂的。如果可能的话,我会在我的应用程序中进行计算。
  • 你确定你用的是mysql它看起来像MS SQL Server T-sql

标签: mysql sql sql-server database leap-year


【解决方案1】:

*使用此代码*

SELECT DATE_SUB('2013-02-28', INTERVAL 365 DAY)

【讨论】:

    【解决方案2】:

    好吧,这里有一些事情要考虑......

    SELECT CASE WHEN DAY(LAST_DAY('2012-02-28'))=29 THEN 'foo' ELSE 'bar' END x;
    +------+
    | x    |
    +------+
    | foo  |
    +------+
    1 row in set (1.22 sec)
    
    SELECT CASE WHEN DAY(LAST_DAY('2013-02-28'))=29 THEN 'foo' ELSE 'bar' END x;
    +------+
    | x    |
    +------+
    | bar  |
    +------+
    

    【讨论】:

      【解决方案3】:

      使用您的逻辑,您应该使用案例以不同的方式处理该月的最后一天。如果今天是该月的最后一天,那么它将是一年前该月的最后一天。

      SELECT CASE WHEN LAST_DAY(CURDATE())=CURDATE()
                  THEN LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 YEAR)) 
                  ELSE DATE_SUB(CURDATE(),INTERVAL 1 YEAR)
             END     
      

      但是如果今天是 29.02,你会怎么做?应该是一年前的哪一天?在这种情况下,对于 28.02 和 29.02,您会得到与一年前相同的 28.02。我们应该在这里使用什么逻辑?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2011-07-16
        相关资源
        最近更新 更多