SQL DATEADD不返回季度末

时间:2019-03-13 17:45:29

标签: sql sql-server

我正在尝试使用DATEADD函数为日期添加四分之一。我的环境是MS Mgmt Studio(v17.7)和SQL Server Express(14.0.1000)。总部位于英国。

我使用的代码非常简单,如下所示,我对返回值感到困惑:

SELECT DATEADD(q,1,'1997-09-30')

我期望返回值为“ 1997-12-31 00:00:00.000”,但我却得到了“ 1997-12-30 00:00:00.000”,即该月的30号,而不是31号。

我尝试搜索堆栈溢出,但未发现任何类似问题。到目前为止,我的方法是尝试更改参数和日期类型,例如:

SELECT DATEADD(q,2,'1997-09-30')-返回1998-03-30 00:00:00.000(我希望1998-03-31 00:00:00.000)

SELECT DATEADD(qq,1,'1997-09-30') / SELECT DATEADD(quarter,1,'1997-09-30')-相同的结果

我也尝试使用参数

declare @date datetime (also tried datetime2, smalldate, date)
set @date = ('1997-09-30')
SELECT DATEADD(q,1,@date) 

任何人都可以给我指出我要去哪里的地方吗?我是否缺少使用DATEADD函数的功能,或者是否需要更改某些环境变量?谢谢!

2 个答案:

答案 0 :(得分:6)

一个季度定义为3个月。为什么您要在1997-09-30后三个月内成为1997-12-30?您不会期望DATEADD(q,1,'20000101')返回'2000-06-30''2000-03-31'吗?

如果您希望在特定日期后的3个月中的月底,可以使用EOMONTH

SELECT EOMONTH(DATEADD(QUARTER,1,'19970930'));

答案 1 :(得分:0)

由于您具有SQL Server的较新版本,Larnu的答案是一个不错的选择。如果您有一个没有EOMONTH函数的旧版本(<2012年),则可以执行以下操作:

declare @date date
set @date = ('1997-09-30')
SELECT DATEADD(DAY,-1,DATEADD(q,1,DATEADD(DAY,1,@date)))