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,它运行良好,但这无助于解决问题。感谢您对包含异常的评论。我考虑过它们,但没有考虑将它们和它们的结果包括在我的样本中。我会记住的。