Преобразование даты не работает в предложении где - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь выполнить запрос к столбцам SOE (поле datetime) и Answer (поле varchar) из таблицы, где значения NOT ALL - это даты, но некоторые из них.Если я удалю датировку из предложения where, я смогу выполнить запрос очень хорошо.Но при включении он выдает ошибку, говоря, что 'Преобразование не удалось при преобразовании даты и / или времени из символьной строки' .

Для контекста я использую SQL Server 2014.

Вот так выглядит мой запрос:

select ID, 
       convert(datetime, Answer, 121) as Answer, 
       datediff(dd,convert(datetime, 
       Answer, 121), SOE) as Days
from table
where Type in (1) and SOE between '2019-01-01' and '2019-03-31'
      and FormLocation = 'M1005_INP_DISCHARGE_DT'
      and PayorType = 'Medicare'
      and Answer <> ' '
      datediff(dd, convert(datetime, Answer, 121), SOE) <= 5

Буду признателен за любые советы по решению этой проблемы.,

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Перед выполнением преобразования в дату и время убедитесь, что данные в поле «Ответ» могут быть преобразованы в дату. Попробуйте это ...

and ((isdate(Answer) = 1) and (datediff(dd, convert(datetime, Answer, 121), SOE) <= 5))

0 голосов
/ 23 января 2019

Используя apply, вы можете сэкономить некоторый повторяющийся код:

select ID, 
       answer_datetime as Answer, 
       datediff(day, answer_datetime, SOE) as Days
from table t cross apply
     (values (try_convert(datetime, Answer, 121))) v(answer_datetime)
where Type in (1) and
      SOE between '2019-01-01' and '2019-03-31' and
      FormLocation = 'M1005_INP_DISCHARGE_DT' and
      PayorType = 'Medicare' and
      Answer <> ' ' and
      datediff(day, answer_datetime, SOE) <= 5;

Но вы должны действительно исправить определения данных, чтобы дата / время сохранялись с использованием правильного типа.

0 голосов
/ 23 января 2019

С 2012 года вы можете использовать try_convert().

...
datediff(dd, try_convert(datetime, Answer, 121), SOE) <= 5
...

try_convert() возвращает NULL, если преобразование не удалось. И так же datediff() тогда. Так что вы можете захотеть разобраться с этим делом каким-то образом.

...