SQL DATEADD不返回季度末

SQL DATEADD不返回季度末,sql,sql-server,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日 我尝试搜索堆栈溢出,但没有发现任何类似

我正在尝试使用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日

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

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

选择日期添加(qq,1,'1997-09-30')
/
选择日期添加(季度,1,'1997-09-30')
-结果相同

我还尝试使用一个参数

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

谁能告诉我哪里出了问题?我是否缺少DATEADD函数的某些功能,或者是否需要更改某些环境变量?谢谢

季度定义为3个月。为什么你希望1997-09-30年之后的3个月不会是1997-12-30年?您不会期望
DATEADD(q,1,'20000101')
返回
'2000-06-30'
'2000-03-31'

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

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

因为您有一个更新版本的SQL Server,所以Larnu的答案非常好。如果您有一个较旧的(请尝试选择eomonth(DATEADD(q,1,'1997-09-30'))并查看它是否有效。问题是,您的日期增加了一个季度。如果您使用1997-12-30),您将无法得到正确的结果。你最好使用一个日期表。谢谢@Larnu,所有帮助我解决问题的人的有用评论。回想起来似乎很明显,我在通过财政季度末,例如“1997年9月30日”,我认为我可以使用“q”移动到未来或以前的财政季度末。我的想法是DATEADD(m,3,'19970930')是我未来几个月的工作方式,不知何故,“q”有不同的功能。谢谢,知道这一点很有用。
declare @date date
set @date = ('1997-09-30')
SELECT DATEADD(DAY,-1,DATEADD(q,1,DATEADD(DAY,1,@date)))