[英]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.