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-302020-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))