我从这段代码中得到以下错误
留言242,第16层,第3州,第3线
将varchar数据类型转换为日期时间数据类型导致值超出范围。
t - sql:
datediff(dd, a.ContractStartDate,
cast(case when isdate(
cast(datepart(month, dateadd(mm, 0, a.WarrStartDate)) as varchar(2)) + '/' +
cast('00' + datepart(DAY, a.WarrStartDate) as varchar(2)) + '/' +
cast(datepart(year, dateadd(YEAR, case when a.TRSCustNO = 89555 then 2 else 3 end, a.WarrStartDate)) as varchar(4)))=0
then
cast('00'+datepart(month,dateadd(mm,0,a.WarrStartDate))as varchar(2))+'/'+
cast('00'+datepart(DAY,dateadd(dd,-1,a.WarrStartDate)) as varchar(2)) +'/'+
cast(datepart(year,dateadd(YEAR,case when a.TRSCustNO = 89555 then 2 else 3 end
,a.WarrStartDate))as varchar(4))
else
cast('00'+datepart(month,dateadd(mm,0,a.WarrStartDate))as varchar(2))+'/'+
cast('00'+datepart(DAY,a.WarrStartDate) as varchar(2)) +'/'+
cast(datepart(year,dateadd(YEAR,case when a.TRSCustNO = 89555 then 2 else 3 end
,a.WarrStartDate))as varchar(4)
) end
as datetime)
) as EarnDays
除非我遗漏了什么,否则这些都可以像这样简化。我没有看到在date和varchar类型之间进行强制转换的理由。
case
when datediff(dd,a.ContractStartDate,
dateadd(year,(case when a.TRSCustNO = 89555 then 2 else 3 end), a.WarrStartDate)
)=0
then
dateadd(year, (case when a.TRSCustNO = 89555 then 2 else 3 end),
dateadd(dd,-1,a.WarrStartDate)
)
else
dateadd(year, (case when a.TRSCustNO = 89555 then 2 else 3 end), a.WarrStartDate)
end as EarnDays
如果我错过了重点,请告诉我。
如果你想知道为什么你得到这个错误,只是不要把它转换回一个日期,看看输出