Sql server SQL Server日期时间数据,超出范围值错误

Sql server SQL Server日期时间数据,超出范围值错误,sql-server,datetime,Sql Server,Datetime,我从这段代码中得到以下错误 味精242,第16级,第3状态,第3行 将varchar数据类型转换为datetime数据类型导致值超出范围 T-SQL: datediff(dd, a.ContractStartDate, cast(case when isdate( cast(datepart(month, dateadd(mm, 0, a.WarrStartDate)) as varchar(2)) + '/' + cast('00' + datepart(

我从这段代码中得到以下错误

味精242,第16级,第3状态,第3行
将varchar数据类型转换为datetime数据类型导致值超出范围

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
如果我没有抓住要点,请告诉我


如果您想知道出现错误的原因,请不要将其转换回日期并查看输出。

首先确保varchar=>datetime转换中的所有字符串始终采用YYYYMMDD格式。因此,请将代码移到年份,然后移到月份,然后移到日期??我已经这样做了,但仍然没有起作用。我想@Alejandro是说对文本字符串使用ISO日期格式,这样就不需要转换日期。谢谢,这似乎起作用了,而且更容易。@amymon87-我只是说,如果你对自己为什么会出错感到好奇,你就不能把你的varchar放到约会上。只要看一看,就可以看出,到目前为止,您正试图转换以下类型的值—“00/00/2014”。这是因为你在做“00”+“day”,但只做了前两个字符(varchar(2))。我现在明白你的意思了-非常感谢!