简体   繁体   English

用DATEADD减去年份不能正确处理leap年

[英]Subtracting a year with DATEADD doesn't handle leap years correctly

While subtracting a year form current date, if current day is February 28 2013 then below statement returns February 28 2012 , but correct result should be February 29 2012 as 2012 is a leap year. 虽然减去了一年的形式当前日期,如果当前日期是February 28 2013 ,然后在下面的语句返回February 28 2012 ,但正确的结果应该是February 29 2012作为2012年是闰年 How can this scenario be handled. 如何处理这种情况。

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

* 使用此代码*

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

Well, here's something to think about... 好吧,这是要考虑的事情...

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

Using your logic you should use case to process last day of the month in different way. 使用逻辑,您应该使用案例以不同的方式处理月份的最后一天。 If today is a last day of the month it will be the last day of the month one year ago. 如果今天是一个月的最后一天,那么它将是一年前一个月的最后一天。

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

But what you will do if today is 29.02 ? 但是,如果今天是29.02,您将做什么? WHAT day a year ago it should be? 一年前应该是哪一天? In this case for 28.02 and 29.02 you get the same 28.02 a year ago. 在这种情况下,对于28.02和29.02,您一年前会获得相同的28.02。 What logic we should use here? 我们应该在这里使用什么逻辑?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM