【问题标题】:Conversion failed error when running case statement运行 case 语句时出现转换失败错误
【发布时间】:2020-03-04 19:54:47
【问题描述】:

当我运行以下 case 语句时,我收到错误“将 varchar 值“NO”转换为数据类型 int 时转换失败”。有人可以告诉我我在这里做错了什么吗?谢谢

,CASE
         WHEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)) > 0
                THEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10))
         WHEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)) < 0
                THEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10))

          ELSE 'NO'

       END AS DAYS_BEFORE_DUE_DATE

【问题讨论】:

  • 一个CASE表达式只能返回一种数据类型,它使用Data Type Precedence来确定返回数据类型。对于上述内容,您有一些int 值,然后是'NO',即varchar(2)。显然'NO' 不能转换为int,因此会出现错误。我建议返回NULL,如果您需要显示“否”,请在显示层中处理。
  • 非常感谢您的回复。非常感谢您的帮助。
  • 这完全没有意义。将日期转换为字符串以作为日期函数的参数调用?

标签: sql tsql varchar


【解决方案1】:

在这种情况下,您可以像这样隐藏DATEDIFF 函数的结果:

select CASE WHEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)) > 0
            THEN convert(varchar, DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)))
            WHEN DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)) < 0
            THEN convert(varchar, DATEDIFF(DAY, convert(VARCHAR, Deliveries.DUE_DATE, 10), convert(VARCHAR, DELIVERIES.OB_DELIVERY_DATE, 10)))
            ELSE 'NO'
       END AS DAYS_BEFORE_DUE_DATE
from Deliveries    

Here is a demo

【讨论】:

  • 非常感谢。这有效!我只是喜欢这个网站,那里有所有聪明的人。祝你有个愉快的夜晚!
  • 嗨@SHELL,不客气。感谢您的反馈意见。祝你有个愉快的夜晚。
【解决方案2】:

case 语句中只能返回一种数据类型。但是您可以使用 NULL 代替 NO

【讨论】:

  • 感谢您的洞察力。
【解决方案3】:

正如 Larnu 的评论所表明的,问题是在 case表达式 中混合数据类型。 (TSQL 没有case 语句。)

猜测:Due_DateOB_Delivery_Date 可能是 Date 列。如果是这样,您可以简单地使用DateDiff 来获得天数的差异:

DateDiff( day, Deliveries.Due_Date, Deliveries.OB_Delivery_Date )

由于两个then 子句返回相同的值,它们可以合并:

case when DateDiff( day, Deliveries.Due_Date, Deliveries.OB_Delivery_Date ) != 0
  then Cast( DateDiff( day, Deliveries.Due_Date, Deliveries.OB_Delivery_Date ) as VarChar(3) )
  else 'NO' end as Days_Before_Due_Date

注意Cast用于将数值转换为字符串。

如果您想提早/准时/迟到,您可以使用Sign

case Sign( DateDiff( day, Deliveries.Due_Date, Deliveries.OB_Delivery_Date ) )
  when 1 then 'Late'
  when 0 then 'On Time'
  when -1 then 'Early'
  end as ScheduleStatus

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多