Преобразование даты в дату и время дает ошибку в sql

Я храню дату в столбце 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,

Как я могу заставить это работать?

Это Microsoft SQL Server?

UnhandledExcepSean 30.05.2019 03:49

В каком представлении '1/01/2018' будет равно "2018-01-22 00:00:00.0000000"?

sticky bit 30.05.2019 03:50

@stickybit я хочу преобразовать дату в значение даты и времени. Я предоставил пример значения для столбца даты и времени

Ratha 30.05.2019 03:53

Ну, технически вы хотите преобразовать varchar(50), то есть строку, в datetime. Но я хочу сказать, что, учитывая '1/01/2018', я думаю, что 2018 год — это часть года. И 1, и другой 01 - это день и месяц. Так что до "2018-01-" всё ясно. Но как может быть 22 для дня, когда есть 1 и 01?

sticky bit 30.05.2019 03:57

Проблемы преобразования дат становятся более очевидными, когда в примере четко определены части месяца и дня. 1/1/2018 может быть либо мм/дд/гггг, либо дд/мм/гггг, и я подозреваю, что «вне диапазона» означает, что вы пытаетесь преобразовать дни в месяцы, но в этом примере трудно сказать. Если вы измените пример, добавив 22 в дневную часть строки, это поможет получить правильный ответ.

Ben 30.05.2019 04:01

Конечно, другая проблема заключается в том, что когда вы используете строку для представления даты, вы можете просто получить неверные данные в поле строки.

Ben 30.05.2019 04:04

Как человека, живущего в стране, где используется DMY, а не MDY, меня всегда сводило с ума то, что во всех примерах в документации Microsoft использовалось 1 января. Мне это не помогло!

TomC 30.05.2019 04:06
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
148
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Посмотрите на значения, которые не могут быть преобразованы:

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

Ratha 30.05.2019 03:55

@Рата. . . Потому что у вас есть строка, которую база данных не может преобразовать. Вот почему вы должны использовать try_convert(), чтобы увидеть неверные значения.

Gordon Linoff 30.05.2019 03:56

Я думаю, вы хотите использовать set dateformat dmy. Вот пример:

declare @d varchar(15) 
set @d='13/1/2018'
set dateformat dmy
select convert(datetime,@d)

Другие вопросы по теме