Isnull с целыми числами и char

Я пытаюсь получить разные дни из двух столбцов, и если столбец ab.Final_billdate имеет значение NULL, я хочу поместить строку «UNBILLED». Я попытался сделать два ниже, но я получаю сообщение об ошибке.

Это то, что у меня есть, и я получаю ошибку в строке unbilled .

Ошибка преобразования при преобразовании значения varchar 'UNBILLED' в тип данных int.

isnull(datediff(day,ab.Final_billdate,dd.medate),'UNBILLED') as billing

Я пытался сделать выражение case, подобное этому, но получаю ту же ошибку, потому что я пытаюсь поместить числа и символы в один и тот же выходной столбец. Это возможно? Не уверен, что мне нужно его разыграть?

Это выражение случая

case when  ab.Final_billdate is not null then datediff(day,ab.Final_billdate,dd.medate) else 'UNBILLED' end as billing

Желаемый результат:

|Billing|
   27
   54
   78
  UNBILLED

ОБНОВЛЕНИЕ: вот что я сделал, чтобы получить то, что хотел

,isnull(CONVERT(varchar(8), datediff(day,ab.Final_billdate,dd.medate)), 'UNBILLED') AS AgeFromFinalBill

person cardonas    schedule 23.01.2020    source источник
comment
DATEDIFF возвращает int, а 'UNBILLED' не int, а varchar(8); ошибка довольно ясна, в чем проблема. Не смешивайте типы данных. Вам будет гораздо лучше просто использовать значение NULL.   -  person Larnu    schedule 24.01.2020
comment
@larnu А, понял! Я буду придерживаться нулей. Спасибо .   -  person cardonas    schedule 24.01.2020
comment
Вы можете привести int к varchar, и это избавит вас от ошибки.   -  person smoore4    schedule 24.01.2020
comment
@smoore4 попробую. Спасибо.   -  person cardonas    schedule 24.01.2020
comment
@smoore4 Спасибо. Я смог получить желаемый результат. Я знаю, что это не лучшая идея, но конечный пользователь хочет только значения, как это работает. вот что я сделал, isnull(CONVERT(varchar(8), datediff(day,ab.Final_billdate,dd.medate)), 'UNBILLED') AS AgeFromFinalBill   -  person cardonas    schedule 24.01.2020
comment
в яблочко. convert или cast будут работать: isnull(cast(datediff(day,ab.Final_billdate,dd.medate) as varchar(8)), 'UNBILLED') AS AgeFromFinalBill   -  person smoore4    schedule 24.01.2020
comment
Я действительно не рекомендую конвертировать в varchar, 2 не больше, чем 10; но '2' больше больше, чем '10'. Используйте правильный тип данных для ваших данных.   -  person Larnu    schedule 24.01.2020


Ответы (1)


вы можете попробовать установить дату 1900-01-01 в нулевые значения, а в подзапросе изменить значение 1900-01-01 на «UNBILLED»

Select CASE WHEN B.billing ='19000101' THEN 'UNBILLED' ELSE B.billing END AS billing
 From
(
Select case when  ab.Final_billdate is not null then datediff(day,ab.Final_billdate,dd.medate) else '19000101' end as billing
FROM Table AS A
) AS B
person armando rodriguez    schedule 23.01.2020