使用DATEADD减去一年并不能正确处理闰年

时间:2013-05-07 09:50:42

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

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

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

3 个答案:

答案 0 :(得分:5)

* 使用此代码*

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

答案 1 :(得分:0)

嗯,这是值得考虑的事情......

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  |
+------+

答案 2 :(得分:0)

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

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。我们应该在这里使用什么逻辑?