2015-07-14 4 views
2

У меня следующий запрос ниже, который вычисляет определенную сумму на основе различий даты. Тем не менее, я не мог выполнить запрос из-за ошибки:SQL Server Datetime манипуляция

Msg 8114, Level 16, State 5, Line 7
Error converting data type varchar to numeric.

Запрос:

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' 
+0

на какую линию происходит эта ошибка? – Oluwafemi

+0

, то есть сообщение об ошибке: «Msg 8114, уровень 16, состояние 5, строка 7 Ошибка преобразования типа данных varchar в числовой». – jpineds

+3

Я бы предположил, что проблема «wut» –

ответ

2

Вы не можете использовать несколько типов в CASE отраслях:

Edit else 'wut' в else 0

+0

ну, это было неловко. Спасибо за ответ. – jpineds

+1

Собственная причина: * Типы данных input_expression и каждое выражение when_ должны быть одинаковыми или должны быть неявным преобразованием * –

1

У вас проблема, потому что у вас разные типы данных на THEN и ELSE частей , Это должно быть то же самое. Вы можете исправить это путем преобразования THEN части INT типа данных в 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))