【问题标题】:SQL Server Datetime manipulationSQL Server 日期时间操作
【发布时间】:2015-10-02 14:40:55
【问题描述】:

我在下面有以下查询,它根据日期差异计算一定数量。但是,由于错误,我无法执行查询:

消息 8114,第 16 级,状态 5,第 7 行
将数据类型 varchar 转换为数值时出错。

查询:

declare @var1 datetime
declare @var2 datetime          

set @var1 = '2015-07-14 13:31:43.797'
set @var2 = '2015-07-14 13:31:43.797'

select 
    'Reefer' = 
    case
        when DATEDIFF (hh,@var1,@var2) <= 6 and DATEDIFF (hh, @var1, @var2) > 0
          then 429.000
          else
            case 
                when (DATEDIFF (hh,@var1,@var2) % 6) > 0
                    then 429.00 * ((DATEDIFF (hh,@var1,@var2) / 6)+ 1) 
                else 'wut'
            end
    end 
from 
    container con
inner join 
    containerdetail cod on con.containernumber = cod.containernumber
left join 
    dea on dea.containernumber = con.containernumber
where 
    con.billofladingnumber = 'IMPJCP07140003'

【问题讨论】:

  • 这个错误发生在哪一行?
  • 准确来说,错误信息是:“Msg 8114, Level 16, State 5, Line 7 Error convert data type varchar to numeric。”
  • 我认为问题出在 'wut'
  • 注意 datediff 和 hours,它可能并不明显,但 11:59 和 12:00 之间的差异是 1。

标签: sql sql-server datetime stored-procedures


【解决方案1】:

您有问题,因为您在 THENELSE 部件上有不同的数据类型,应该是相同的。您可以通过将INT 数据类型的THEN 部分转换为NVARCHAR() 来修复它:

case 
  when (DATEDIFF (hh,@var1,@var2) % 6) > 0
        then CAST(429.00 * ((DATEDIFF (hh,@var1,@var2) / 6)+ 1) AS VARCHAR(20))
    else 'wut'
end

这部分then 429.000也应该转换成NVARCHAR()

THEN CAST(429.000 AS NVARCHAR(20))

【讨论】:

    【解决方案2】:

    您不能在CASE 分支中使用多种类型:

    else 'wut' 编辑为else 0

    【讨论】:

    • 嗯,这很尴尬。感谢您的回答。
    • 正确的原因是input_expression和每个when_expression的数据类型必须相同或者必须是隐式转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2012-05-14
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多