2015-12-30 3 views
0

Я бегу SQL Server 2008 и у меня есть поле datetime, из этого поля я хочу только извлечь дату и час. Я попытался разобрать с помощью datepart(), но я думаю, что я сделал это неправильно, так как когда я попытался соединить два обратно, я получил числовое значение. То, что я попытался былоИзвлечь дату и час только с даты Поле времени

Select Datepart(YEAR, '12/30/2015 10:57:00.000') + 
     Datepart(HOUR, '12/30/2015 10:57:00.000') 

И что возвращено 2025 Что я хочу видеть, возвращенное

12/30/2015 10:00:00.000 

ответ

3

Вы можете использовать DATEADD и DATEDIFF:

DECLARE @d DATETIME = '12/30/2015 10:57:00.000'; 

SELECT DATEADD(second,DATEDIFF(second,'1970-01-01',@d)/3600*3600 , '1970-01-01') 
-- 2015-12-30 10:00:00 

LiveDemo

Как это работает:

  1. Получить разницу в секундах от 1970-01-01
  2. Разделить на 3600 (целочисленное деление, поэтому часть после запятой будет пропущено)
  3. умножаем на 3600, чтобы получить значение обратно полный часы
  4. Добавить вычисляемый секунд номер в 1970-01-01

С SQL Server 2012+ аккуратный способ заключается в использовании DATETIMEFROMPARTS:

SELECT DATETIMEFROMPARTS(YEAR(@d), MONTH(@d), DAY(@d), DATEPART(HOUR, @d),0,0,0) 

LiveDemo2

+0

почему вы разделите на 3600 * 3600? – FartStopper

+1

@FartStopper Добавлено объяснение – lad2025

Смежные вопросы