Ошибка преобразования при запуске оператора case - PullRequest
1 голос
/ 04 марта 2020

Я получаю сообщение об ошибке «Ошибка при преобразовании значения varchar« NO »в тип данных int» при выполнении следующей инструкции case. Может кто-нибудь сказать мне, что я здесь делаю не так? Спасибо

,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

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

В этом случае вы можете скрыть результат функции 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    

Вот демоверсия

0 голосов
/ 04 марта 2020

Как ясно из комментария Ларну, проблема заключается в смешивании типов данных в выражении case . (T SQL не имеет оператора case .)

Гадание на: Due_Date и OB_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 используется для преобразования числового значения c в строку.

Если вы хотите обрабатывать рано / вовремя / поздно, вы можете использовать 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
0 голосов
/ 04 марта 2020

В операторе case может быть возвращен только один тип данных. Однако Вы можете использовать NULL вместо NO.

...