Как вставить данные varchar в поле даты и времени (SQL Server 2005)?

У меня есть эти данные, которые я хочу вставить в таблицу. Пример данных MM/DD/YYYY + 1 день и 12:00:00 PM

В основном мне нужно вставить текущую дату + 1 день и конкретное время 12:00:00.

Мой код таков:

DECLARE @MyEstimatedDate as varchar(100)    ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate1 as varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate2 as varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate3 as DATETIME       ---FINAL DATA NEEDED. This is the data I want inserted.

SET @MyEstimatedDate = DATEADD(day,1,GETDATE()) 
SET @MyEstimatedDate1 = CONVERT(VARCHAR(100),@MyEstimatedDate,101)
SET @MyEstimatedDate2 = @MyEstimatedDate1 + ' 12:00:00 PM'
SET @MyEstimatedDate3 = cast(@MyEstimatedDate2 as datetime)  ---I believe this is the error

Сообщение об ошибке, которое я получаю:

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


person user2059064    schedule 10.02.2013    source источник


Ответы (3)


Просто не используйте varchar при манипулировании данными datetime. SQL Server 2005 предлагает достаточно инструментов, чтобы вы могли избежать преобразования.

Ниже приведен более или менее известный метод удаления временной части из значения datetime:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @InputDateTime), 0);

В приведенном выше примере DATEDIFF вычисляет количество дней между датой, указанной как 0, и заданной датой. Затем к числу дней добавляется DATEADD на дату 0. Конечным результатом является значение datetime со временем 00:00:00 и той же датой, что и @InputDateTime. Это связано с тем, что дата 0 является целочисленным представлением 1900-01-01 00:00:00: ее временная часть равна нулю, а поскольку мы увеличили ее на целое число дней, то же самое и с временной частью результата.

Теперь, если вместо DATEDIFF дней добавить DATEDIFF+1, получится следующий день. Кроме того, если вместо 0 в качестве даты для увеличения вы используете 12:00, вы получите полдень следующего дня, что, по-видимому, и является тем, что вам нужно. Итак, окончательное выражение будет выглядеть так:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @InputDateTime) + 1, '12:00');

Поскольку ваша временная метка ввода должна быть текущей датой и временем, просто замените @InputDateTime на GETDATE():

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) + 1, '12:00');
person Andriy M    schedule 10.02.2013
comment
ИДЕАЛЬНО! Спасибо за полное объяснение. - person user2059064; 11.02.2013

Почему бы просто не сделать

cast(dateadd(day, 1, getdate()) as date)

это было за полночь. В полдень сделайте это

dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as date) as datetime))  

забудьте вышесказанное, это неправильно.

Правильный ответ

dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as date) as datetime))  

В этот раз даже протестировал.

person Dan Bracuk    schedule 10.02.2013
comment
Я получил этот вывод: «10.02.2013 23:58:28». Вместо этого мне нужно, чтобы вывод был таким 10.02.2013 12:00:00 - person user2059064; 10.02.2013
comment
Мой пересмотренный ответ дает мне 2013-02-11 12:00:00.000. Формат является функцией локальной установки, и мой отличается от вашего. Однако значение верное. - person Dan Bracuk; 10.02.2013
comment
Спасибо, но я получил этот вывод: «12 февраля 2013 г., 12:38:00». Мне нужно, чтобы стандартный вывод выглядел так: «12.02.2013, 12:00:00». 12:00:00 - постоянно. - person user2059064; 10.02.2013
comment
вы не можете использовать дату в mssql 2005 - person t-clausen.dk; 10.02.2013
comment
Это то, что я использовал: dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as datetime) as datetime)) и получил этот вывод '12.02.2013 12:38:00' . Мне нужно, чтобы время было 12:00:00. - person user2059064; 10.02.2013

Тип datetime содержит дату + время. В вашем случае для @MyEstimatedDate1 нужна только дата

DECLARE @MyEstimatedDate varchar(100)    ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate1 varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate2 varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate3 DATETIME       ---FINAL DATA NEEDED. This is the data I want inserted.

SET @MyEstimatedDate = DATEADD(day, 1, GETDATE()) 
SET @MyEstimatedDate1 = CONVERT(VARCHAR(100), CAST(@MyEstimatedDate AS date), 101)
SET @MyEstimatedDate2 = @MyEstimatedDate1 + ' 12:00:00 PM'
SET @MyEstimatedDate3 = cast(@MyEstimatedDate2 as datetime)   ---I believ

ИЛИ просто использовать его

SELECT DATEADD(hour, 36, GETDATE() - CAST(GETDATE() AS time))
person Aleksandr Fedorenko    schedule 10.02.2013