Ошибка MS SQL: преобразование типа данных varchar в тип данных datetime привело к ошибке - PullRequest
0 голосов
/ 07 ноября 2019

Я использую MS SQL Server. Один столбец таблицы определен как order_date varchar(25) и хранится в формате, подобном 05/11/2015 07:54:16

. В моем запросе select я пытаюсь преобразовать его в формат даты, например (yyyy-mm-dd HH:MM:SS:000, например * 1007. *

Я пытался с

select CONVERT(varchar(50), CAST(order_date AS datetime),121) from <table>

В моей таблице около 500 записей, но после выборки 10 записей в моем ожидаемом формате я получаю эту ошибку:

Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона

Есть ли проблемы с моим преобразованием?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Здесь есть пара проблем. Во-первых, вы выбираете тип данных, но я просто повторю свой комментарий для этого: "" я пытаюсь преобразовать это в формат даты "* Это совершенно неправильный подход. Прекратите сохранять датыв качестве varchar используйте тип данных даты и времени . Причиной возникновения этой ошибки является неправильный выбор типов данных. Исправьте это и заставьте слой представления работать с форматированием. "

Теперь идем дальше. У вас есть выражение ниже:

CONVERT(varchar(50), CAST(order_date AS datetime),121)

Во-первых, поскольку ваше значение равно varchar, вам нужно указать SQL Server формат, в котором он находится;dd/MM/yyyy hh:mm:ss (я думаю, что '05/11' неоднозначно)) не однозначно. То, что у вас есть, это британский стиль, который является стилем 103:

CONVERT(datetime,'05/11/2015 07:54:16',103)

Теперь вы можете преобразовать это в ваш формат ISO:

CONVERT(varchar(23),CONVERT(datetime,'05/11/2015 07:54:16',103),121)

Это возвращает varchar значение '2015-11-05 07:54:16.000'

0 голосов
/ 07 ноября 2019

Я бы попробовал посмотреть, каково значение order_date на момент ошибки. Возможно, то, что вы предполагаете считать строкой даты и времени в формате mm/dd/yyyy..., на самом деле - dd/mm/yyyy....

Т.е. следующие выходные данные 2015-05-11 07:54:16.000, поскольку в моей системе задан формат даты и времени mm/dd/yyyy.

    declare @order_date varchar(100) = '05/11/2015 07:54:16'; -- mm/dd/yyyy...
    print CONVERT(varchar(50), CAST(@order_date AS datetime),121);

, выдает следующее сообщение об ошибке: Преобразование типа данных varchar втип данных datetime привел к значению вне допустимого диапазона.

    set @order_date = '13/09/2015 07:54:16'; -- dd/mm/yyyy...
    print CONVERT(varchar(50), CAST(@order_date AS datetime),121); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...