Ошибка преобразования при преобразовании даты и / или времени из строки символов. при фильтрации sql select query - PullRequest
0 голосов
/ 02 июля 2018

У меня относительно простой запрос, для которого даты, которые сохраняются в таблице как nvarchar (200).

Я пытаюсь сделать фильтр для полей InteractionDate, который выглядит следующим образом

'02-03-2018 12:00', '03-04-2018 14:46', '03-04-2018 14:44' etc.

Но вы получите ошибку Conversion failed when converting date and/or time from character string. при попытке конвертировать поле даты nvarchar.

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

 select
 act.InteractionDate,
 act.Status
 from JobCanvas_B2B canvas
  inner join PersonActivity_JobCanvas inters on inters.CanvasId = 
  canvas.CanvasId
   inner join PersonActivity act on act.PersonActivityId = 
    inters.PersonActivityId 
    inner join Stage s on s.StageId = act.StageId
     where convert(date, act.InteractionDate, 101) > convert(date, '01-01-2018 12:00', 101)

Как правильно выполнить преобразование даты, чтобы запрос работал?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Если вы можете допустить использование только компонента даты, используйте маску 103, как вы делали в своем ответе. Если вам также нужен компонент времени, тогда мы можем попробовать пройти через маску формата 120 с некоторыми манипуляциями со строкой:

CONVERT(datetime, SUBSTRING(act.InteractionDate, 7, 4) + '-' +
     SUBSTRING(act.InteractionDate, 4, 2) + '-' + LEFT(act.InteractionDate, 2) +
     ' '  + RIGHT(act.InteractionDate, 5), 120)

Демо

В идеале, мы должны иметь возможность использовать маску 131 напрямую, но я не мог заставить ее работать, по крайней мере, не с тем типом данных, который у вас есть. Вместо этого приведенный выше фрагмент вручную создает временную метку в формате yyyy-mm-dd hh:mi:ss.

Лучшее долгосрочное решение здесь - не хранить информацию о дате в виде текста. Если вы должны сделать это, то вы в формате ISO, который легко конвертировать с помощью встроенных функций SQL Server.

0 голосов
/ 02 июля 2018

Это сделал трюк,

  where convert(date, act.InteractionDate, 103) > convert(date, '01-01-2018 12:00', 103)
...