SQL 服务器:DATEADD 2 月 29 日而不是 return 30,31 一月
SQL Server : DATEADD 29 February not return 30,31 January
我在 SQL 服务器 2014 中工作,需要从 SQL 服务器 DateTime
准确计算一个月前的数据,但我不知道如何使用 DATEADD
正确。
示例:
SELECT DATEADD(MONTH, -1, '20200229')
returns 2020-01-29
.
SELECT DATEADD(MONTH, -1, '20200301')
returns 2020-02-01
.
但是在第二个语句中,我想得到 2020-01-30
和 2020-01-31
有什么想法吗?
您似乎想要上个月的月底,在这种情况下,将 EOMONTH()
添加到您的脚本中,如下所示
Select EOMONTH( DATEADD(MONTH,-1,'20200229'));
Select EOMONTH( DATEADD(MONTH,-1,'20200301'));
来自docs:
如果下列情况成立:
- datepart 是月份,日期月份比 return 月份多天数
- return 月
中不存在日期
然后,DATEADD return 是 return 月的最后一天。
例如,九月有 30(三十)天;因此,这些语句 return 2006-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');
2020年是闰年。大多数情况下,您的 2/29
无论如何都无法正常工作。
也没有 2/30 & 2/31
所以 1/30 & 1/31
不会出现。
使用带有可选第二个参数的 EOMONTH() 函数,该参数是一个整数,是与日期相差的月数:
select eomonth('2020-02-29', -1);
Returns:
2020-01-31
请试试这个。
SELECT DATEADD(DAY,1,DATEADD(MONTH, -1, '20200229')), DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(MONTH, -2, '20200301')) + 1, 0))
我在 SQL 服务器 2014 中工作,需要从 SQL 服务器 DateTime
准确计算一个月前的数据,但我不知道如何使用 DATEADD
正确。
示例:
SELECT DATEADD(MONTH, -1, '20200229')
returns 2020-01-29
.
SELECT DATEADD(MONTH, -1, '20200301')
returns 2020-02-01
.
但是在第二个语句中,我想得到 2020-01-30
和 2020-01-31
有什么想法吗?
您似乎想要上个月的月底,在这种情况下,将 EOMONTH()
添加到您的脚本中,如下所示
Select EOMONTH( DATEADD(MONTH,-1,'20200229'));
Select EOMONTH( DATEADD(MONTH,-1,'20200301'));
来自docs:
如果下列情况成立:
- datepart 是月份,日期月份比 return 月份多天数
- return 月 中不存在日期
然后,DATEADD return 是 return 月的最后一天。
例如,九月有 30(三十)天;因此,这些语句 return 2006-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');
2020年是闰年。大多数情况下,您的 2/29
无论如何都无法正常工作。
也没有 2/30 & 2/31
所以 1/30 & 1/31
不会出现。
使用带有可选第二个参数的 EOMONTH() 函数,该参数是一个整数,是与日期相差的月数:
select eomonth('2020-02-29', -1);
Returns:
2020-01-31
请试试这个。
SELECT DATEADD(DAY,1,DATEADD(MONTH, -1, '20200229')), DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(MONTH, -2, '20200301')) + 1, 0))