我正在尝试使用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函数的功能,或者是否需要更改某些环境变量?谢谢!
答案 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)))