Coalesce и nullif для обработки подстроки и нулевых значений - PullRequest
1 голос
/ 22 мая 2019

Я использую COALESCE с NULLIF для обработки даты и времени из поля, но все еще получаю значения подстроки в выводе для пустой строки

select coalesce(nullif('20' + LEFT(SUBSTRING(cancelTime,1,8),2)
+ '/' + LEFT(RIGHT(SUBSTRING(canceltime,1,8),5),2) + '/' +  RIGHT(SUBSTRING(cancelTime,1,8),2)+' '+
left(SUBSTRING(cancelTime,10,17),2)
+ ':' + right(left(SUBSTRING(cancelTime,10,17),5),2) + ':' +  right(SUBSTRING(cancelTime,10,17),2),''),'') as CancelDate
  FROM [dbo].[test]

Логика: я хочу показывать дату и время, когда естьдата и время в поле, если значения нет, тогда покажите это как пустое.Например, если задано значение 19/05/19 22:46:05, отобразите это 2019/05/19 22: 46: 05.

Пример данных из поля Canceltime:

canceltime

Blank
19/05/19 22:46:05

Вывод ошибки:

20 / /  ::
2019/05/19 22:46:05

Ожидаемый вывод:

Blank
2019/05/19 22:46:05

Я ожидаю, что 20 / / :: будетпусто на выходе.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Я рекомендую просто обрабатывать вещи как дату / время в их родном формате.Но в вашем случае, вы не можете просто предсказать '20'?

select '20' + canceltime
0 голосов
/ 22 мая 2019

Вы можете использовать CASE для определения «плохих» значений и получения результатов в конкретных случаях. Например:

select
  case when cancelTime 
      like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]'
    then ... -- your long formatting formula here
    else '' -- blank if it doesn't match a date/time value
  end as CancelDate  
from [dbo].[test]

В любом случае, как правило, избегайте хранения данных даты / времени как VARCHAR. Используйте правильный тип данных, например DATETIME, SMALLDATETIME или DATETIME2.

...