Sql server SQL DATEFROMPARTS-年失败(GETDATE())
我正在尝试根据原始值创建几个日期变量,但以当前年份为基础。我能运行的唯一代码似乎过于复杂,并给出了不准确的结果:Sql server SQL DATEFROMPARTS-年失败(GETDATE()),sql-server,date,Sql Server,Date,我正在尝试根据原始值创建几个日期变量,但以当前年份为基础。我能运行的唯一代码似乎过于复杂,并给出了不准确的结果: , DATEADD(DAY,DATEPART(DAYOFYEAR, o.AnnualReviewDate), DATEADD(YEAR,YEAR(GETDATE())-1900,0)) AS ARDateCurr DATEADD(DAY,DATEPART(DAYOFYEAR, o.AnnualReviewDate)+30, DATEADD(YEAR,YEAR(GETDATE(
, DATEADD(DAY,DATEPART(DAYOFYEAR, o.AnnualReviewDate),
DATEADD(YEAR,YEAR(GETDATE())-1900,0)) AS ARDateCurr
DATEADD(DAY,DATEPART(DAYOFYEAR, o.AnnualReviewDate)+30,
DATEADD(YEAR,YEAR(GETDATE())-1900,0)) AS ARDatePlus30
为什么:
DECLARE @Now AS DATE = GETDATE()
DECLARE @Year AS INT = DATEPART(YEAR,@Now)
...
, DATEFROMPARTS(YEAR(@Now),MONTH(o.AnnualReviewDate)-1,
DAY(o.AnnualReviewDate)) AS ARDateMin30
给我错误信息:
'无法构造数据类型date,某些参数的值无效。'
在日期时间计算中不应使用整数运算。改为这样做:
DATEFROMPARTS(YEAR(@Now),MONTH(DATEADD(M,-1,o.AnnualReviewDate)),DAY(o.AnnualReviewDate)) AS ARDateMin30
猜测一下,这些是您要寻找的值吗:
declare @t table (AnnualReviewDate datetime)
insert into @t (AnnualReviewDate) values
('20121004'),('20090924'),('20101007'),('20141008'),('20090508'),
('20120229')
select
AnnualReviewDate,
r.ARCurrDue,
DATEADD(day,-30,ARCurrDue) as ARDateMin30,
DATEADD(day,30,ARCurrDue) as ARDatePlus30
from @t t
cross apply (SELECT DATEADD(year,DATEDIFF(year,AnnualReviewDate,GETDATE())
,AnnualReviewDate) as ARCurrDue) r
结果:
AnnualReviewDate ARCurrDue ARDateMin30 ARDatePlus30
----------------------- ----------------------- ----------------------- -----------------------
2012-10-04 00:00:00.000 2015-10-04 00:00:00.000 2015-09-04 00:00:00.000 2015-11-03 00:00:00.000
2009-09-24 00:00:00.000 2015-09-24 00:00:00.000 2015-08-25 00:00:00.000 2015-10-24 00:00:00.000
2010-10-07 00:00:00.000 2015-10-07 00:00:00.000 2015-09-07 00:00:00.000 2015-11-06 00:00:00.000
2014-10-08 00:00:00.000 2015-10-08 00:00:00.000 2015-09-08 00:00:00.000 2015-11-07 00:00:00.000
2009-05-08 00:00:00.000 2015-05-08 00:00:00.000 2015-04-08 00:00:00.000 2015-06-07 00:00:00.000
2012-02-29 00:00:00.000 2015-02-28 00:00:00.000 2015-01-29 00:00:00.000 2015-03-30 00:00:00.000
也就是说,ARCurrDue应该是与AnnualReviewDate相同的日期和月份,但在当前年份中,然后其他列从该日期起正负30天
你会注意到,我在样本中包含了2月29日,因此你可以看到它的计算结果。你应该始终考虑这些日期的要求,并将它们包含在样本数据中
这里的神奇之处在于使用此表达式将日期的年份重置为当前年份,而不影响除2月29日以外的月份和日期:
DATEADD(year,DATEDIFF(year,AnnualReviewDate,GETDATE())
,AnnualReviewDate)
内部表达式DATEDIFF是自AnnualReviewDate以来经过的年份边界数。然后,外部表达式将相同的整年数添加到AnnualReviewDate上。请注意,如果AnnualReviewDate是将来的日期,此表达式甚至可以使用。MONTHo.AnnualReviewDate-1-如果月份是一月会怎么样?导致错误的值是什么?导致错误的值是YEARGETDATE或YEAR@Now. 如果我使用YEARo.AnnualReviewDate,它运行良好,但这无助于解决问题。感谢您对包含异常的评论。我考虑过它们,但没有考虑将它们和它们的结果包括在我的样本中。我会记住的。