Преобразование даты и времени в строку 'pending', если null в выражении case - PullRequest
0 голосов
/ 14 октября 2019

У меня есть вопрос при изменении одного из моих столбцов в настройках просмотра:

CASE 
   WHEN L.updateTime IS NULL 
      THEN ISNULL(CONVERT(VARCHAR(20), L.updateTime, 120), 'PENDING') 
      ELSE L.updateTime 
END AS updateTime

Команда выполнена успешно, но когда я пытаюсь выбрать топ 1000, она показывает ошибку:

Не удалось выполнить преобразование при преобразовании даты и / или времени из символьной строки

Я перепробовал все возможные варианты, но ничего не помогло. Есть предложения?

Пробовал:

CASE 
   WHEN L.updateTime IS NULL 
      THEN 'PENDING' 
      ELSE L.updateTime 
END AS updateTime

CASE 
   WHEN L.updateTime IS NULL 
      THEN CONVERT(VARCHAR(20), 'PENDING') 
      ELSE L.updateTime 
END AS updateTime

CASE 
   WHEN L.updateTime IS NULL 
      THEN ISNULL(L.updateTime, 'PENDING') 
      ELSE L.updateTime 
END AS updateTime

и многие другие ...

Я видел этот существующий вопрос и пробовал его, но я все равно получаю сообщение об ошибке, когда пытаюсь просмотреть свое мнение. CASTING datetime в string, если значение NULL - с сохранением исходного форматирования даты и времени

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Я понял это ... Мне просто нужно было также преобразовать дату и время в моей части else оператора ... чтобы убедиться, что в операторе case все в одном и том же строковом формате (так как я конвертируюв строку)

Спасибо @Lamak за направление!

CASE WHEN L.updateTime IS NULL THEN ISNULL(CONVERT(varchar(20), L.updateTime, 120),'PENDING') ELSE CONVERT(varchar(20), L.updateTime, 120) END AS updateTime
0 голосов
/ 14 октября 2019

Выражение CASE возвращает тип one . По правилам типизации SQL используется наиболее «ограничительный» тип. То есть даты возвращаются через строки. Если возвращаемый тип является датой / временем, тогда все строки, включая 'PENDING', должны быть преобразованы.

И предложение ELSE означает, что тип возвращаемого значения - дата / время.

Я бы порекомендовал:

COALESCE(CONVERT(varchar(20), L.updateTime, 120), 'PENDING') AS updateTime

Логика CASE кажется ненужной. COALESCE() делает то, что вы хотите.

...