【问题标题】:SQL Server datetime data, Out-of-range value errorSQL Server 日期时间数据,超出范围的值错误
【发布时间】:2014-05-05 00:10:18
【问题描述】:

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

消息 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

【问题讨论】:

  • 首先确保 varchar=>datetime 转换中的所有字符串始终采用 YYYYMMDD 格式。
  • 那么移动代码那年然后月然后日期??我已经这样做了,但它仍然没有工作
  • 我认为@Alejandro 是说对文本字符串使用 ISO 日期格式,这样就不需要转换日期。

标签: sql-server datetime


【解决方案1】:

除非我遗漏了什么,否则都可以这样简化。我没有看到在 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

如果我错过了重点,请告诉我。

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

【讨论】:

  • 谢谢,这似乎奏效了,而且更容易了。你是什​​么意思得到错误并通过回滚来检查它?
  • @amymon87 - 我只是说如果你对为什么会收到错误感到好奇,你不能将你的 varchar 转换为日期。只看它,您似乎正在尝试将以下类型的值转换为迄今为止 - '00/00/2014'。这是因为你在做 '00' + day,然后只取前两个字符 (varchar(2))。
  • 我现在明白你的意思了 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多