Я храню дату в столбце varchar(50)
со значениями вроде thie:
1/01/2018
Я хочу преобразовать их в значение Datetime, например: 2018-01-22 00:00:00.0000000
Мой SQL похож;
select
[Site],
CONVERT(VARCHAR(50), CAST([InvDay] AS DATETIME), 101) as Date,
from tableA;
Но я получаю;
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Я пробовал так же, но с той же ошибкой;
CONVERT(datetime, [InvDay]) as Date,
Как я могу заставить это работать?
В каком представлении '1/01/2018'
будет равно "2018-01-22 00:00:00.0000000"?
@stickybit я хочу преобразовать дату в значение даты и времени. Я предоставил пример значения для столбца даты и времени
Ну, технически вы хотите преобразовать varchar(50)
, то есть строку, в datetime
. Но я хочу сказать, что, учитывая '1/01/2018'
, я думаю, что 2018 год — это часть года. И 1, и другой 01 - это день и месяц. Так что до "2018-01-" всё ясно. Но как может быть 22 для дня, когда есть 1 и 01?
Проблемы преобразования дат становятся более очевидными, когда в примере четко определены части месяца и дня. 1/1/2018
может быть либо мм/дд/гггг, либо дд/мм/гггг, и я подозреваю, что «вне диапазона» означает, что вы пытаетесь преобразовать дни в месяцы, но в этом примере трудно сказать. Если вы измените пример, добавив 22
в дневную часть строки, это поможет получить правильный ответ.
Конечно, другая проблема заключается в том, что когда вы используете строку для представления даты, вы можете просто получить неверные данные в поле строки.
Как человека, живущего в стране, где используется DMY, а не MDY, меня всегда сводило с ума то, что во всех примерах в документации Microsoft использовалось 1 января. Мне это не помогло!
Посмотрите на значения, которые не могут быть преобразованы:
select invday
from tableA
where try_cast(invday as date) is null and invday is not null;
Также неясно, какой у вас формат: мм/дд/гггг или дд/мм/гггг. Вы можете указать формат, используя convert()
:
-- mm/dd/yyyy
select invday
from tableA
where try_convert(date, invday, 101) is null and
invday is not null;
-- dd/mm/yyyy
select invday
from tableA
where try_convert(date, invday, 103) is null and
invday is not null;
Знаете ли вы, почему я получаю исключение преобразования выше? Я хотел бы получить преобразованное значение даты и времени также в varchar
@Рата. . . Потому что у вас есть строка, которую база данных не может преобразовать. Вот почему вы должны использовать try_convert()
, чтобы увидеть неверные значения.
Я думаю, вы хотите использовать set dateformat dmy
. Вот пример:
declare @d varchar(15)
set @d='13/1/2018'
set dateformat dmy
select convert(datetime,@d)
Это Microsoft SQL Server?