Преобразование не удалось, если преобразование даты и / или времени из символьной строки только во время обновления - PullRequest
0 голосов
/ 13 декабря 2018

Я давно искал разрешение и, похоже, просто не могу сформулировать запрос, который возвращает разрешение, так что в качестве последнего средства я разместил здесь.У меня есть таблица SQL-сервера со столбцом varchar, в которой дата и время хранятся в этом формате

"1/1/2013 11:38:31 PM Some other text"

Мне нужно, чтобы эта часть даты и времени этих данных была сохранена в другом столбце в типе данных datetime.Поэтому я создал новый столбец с именем DateTimeLog типа datetime.

Затем я использовал left, чтобы отрезать дополнительный текст и преобразовать его, чтобы изменить значение в формат datetime, и получил ожидаемый результат.

select CONVERT(DATETIME,(rtrim(left(olddate, 21)))) from mytable
results:
"2013-01-01 23:38:31.000"

Пока все хорошо.это то, что я ожидал.Мои проблемы начинаются, когда я пытаюсь обновить свой новый столбец datetime с результатами этого оператора CONVERT.

update mytable
SET DateTimeLog = CONVERT(DATETIME,(rtrim(left(olddate, 21)))) from mytable

Я получаю печально известное сообщение об ошибке «Ошибка преобразования при преобразовании даты и / или времени из символьной строки».

Conversion failed when converting date and/or time from character string.

Я также пытался использовать приведение

update mytable
SET DateTimeLog = (cast(CONVERT(DATETIME,(rtrim(left(oldtable, 21)))) as datetime)) from mytable 

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

1 Ответ

0 голосов
/ 14 декабря 2018

Ваша строка не всегда будет состоять из 21 символа.Ваш пример данных показывает односимвольный месяц и односимвольную дату.Что если, скажем, 12/13/2018?

Тем не менее, вам нужен более надежный способ изолировать эту временную метку.Я использовал PATINDEX, чтобы зафиксировать позицию последнего двоеточия в компоненте времени, с парой регулярных выражений для учета чисел и вещи AM / PM.Затем я добавил 6 к нему, чтобы добраться до конца интересующей строки.

Кажется, это работает:

DECLARE @t TABLE (olddate VARCHAR(100));
INSERT @t
  (
    olddate
  )
VALUES
  ('12/13/2018 11:38:31 PM Some other text')
  ,('1/1/2018 11:38:31 PM Some other text');

SELECT CAST(LEFT(olddate,PATINDEX('%:[0-9][0-9] [AP]M%', olddate)+6) AS DATETIME)
FROM @t;

Результаты:

+-------------------------+
| 2018-12-13 23:38:31.000 |
| 2018-01-01 23:38:31.000 |
+-------------------------+

Rextester:https://rextester.com/BBPO51381 (хотя формат даты на выходе выглядит немного странно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...