2013-02-10 4 views
1

У меня есть эти данные, которые я хочу добавить в таблицу. Образец данных MM/DD/YYYY + 1 день и 12:00:00 PMКак вставить данные varchar в поле datetime (SQL Server 2005)?

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

Мой код заключается в следующем:

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 

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

Превращение символьного типа данных в тип данных даты и времени привело к значению даты и времени из-за границы диапазона ,

ответ

2

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

Ниже приводится более или менее known method отбрасывания часть времени от 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'); 
+0

PERFECT! Спасибо за полное объяснение. – user2059064

0

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

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)) 

На этот раз я даже проверял.

+0

Я получил этот результат: «2/10/2013 11:58:28 PM '. Мне нужно, чтобы результат был таким, как это вместо 10/10/2013 12:00:00 PM – user2059064

+0

Мой пересмотренный ответ дает мне 2013-02-11 12: 00: 00.000. Формат является функцией локальной настройки, а мой отличается от вашего. Однако это значение верно. –

+0

Спасибо, но я получил этот результат: '2/12/2013 12:38:00 PM'. Мне нужен стандартный вывод, чтобы он был таким «2/12/2013 12:00:00 PM». 12:00:00 постоянный. – user2059064

0

дата и время тип содержит дата + время. В вашем случае для @ 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)) 
Смежные вопросы