Как рассчитать разницу в часах (десятичных) между двумя датами в SQL Server?


84

Мне нужно вычислить разницу в часах (десятичный тип) между двумя датами в SQL Server 2008.

Мне не удалось найти какой-либо полезный метод преобразования datetime в десятичное с помощью «CONVERT» в MSDN.
Кто-нибудь может мне с этим помочь?

ОБНОВЛЕНИЕ:
чтобы было ясно, мне также нужна дробная часть (таким образом, десятичный тип). Значит с 9:00 до 10:30 он должен мне вернуть 1.5.

Ответы:


165

DATEDIFF(hour, start_date, end_date)даст вам количество часов, пересеченных между start_dateиend_date .

Если вам нужно количество дробных часов, вы можете использовать DATEDIFFболее высокое разрешение и разделить результат:

DATEDIFF(second, start_date, end_date) / 3600.0

Документация для DATEDIFF доступна на MSDN:

http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx


Отличная идея. Кстати, те же функции существуют и в .Net, поэтому это полезно в VB.Net или C #.
Джефф

1
Почему не DATEDIFF (MINUTE, start_date, end_date) / 60.0
irfandar

8
@irfandar Параметр, datepartпередаваемый в, DATEDIFFбудет контролировать разрешение вывода. Например, если start_dateи end_dateотличается на 59 секунд, то DATEDIFF(MINUTE, start_date, end_date) / 60.0вернет 0, но DATEDIFF(second, start_date, end_date) / 3600.0вернет 0,0163888 (59/3600).
Фил Росс

это решение просто возвращает целое число. если разница во времени всего 15 минут, то час возвращается 0. Я думаю, что следующее решение более реалистично.
Асад Наим

1
@AsadNaeem Решение (использование DATEDIFFпри разрешении выше часа) работает. Например, SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0возвращает 0,250000.
Фил Росс

15

Просто вычтите два значения datetime и умножьте на 24:

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

тестовый сценарий может быть:

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0

Это работает, потому что все даты и времени хранятся внутри как пара целых чисел, первое целое число - это количество дней с 1 января 1900 года, а второе целое число (представляющее время) - это количество ( 1 ) тиков с полуночи. (Для SmallDatetimes целое число временной части - это количество минут с полуночи). Любая арифметика со значениями использует временную часть как долю дня. 6 утра = 0,25, полдень = 0,5 и т. Д. Подробнее см. Ссылку MSDN здесь .

Итак, Cast ((@ Dt2 - @ Dt1) as Float) дает вам общее количество дней между двумя датами. Умножьте на 24, чтобы преобразовать в часы. Если вам нужно общее количество минут, умноженное на минуты в день (24 * 60 = 1440) вместо 24 ...

ПРИМЕЧАНИЕ 1. Это не то же самое, что тик dotNet или javaScript - этот тик составляет около 3,33 миллисекунды.


Хороший трюк. SQL должен включать именованную константу. Я чувствовал себя грязным, когда набирал 24, но я думаю, это то, что я получаю за то, что не Рональд Макдональд.
Аллен

10

DATEDIFF, но обратите внимание, что он возвращает целое число, поэтому, если вам нужны доли часов, используйте что-то вроде этого: -

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600

2

Используя Postgres, у меня были проблемы с DATEDIFF, но я добился успеха:

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

что дало мне результат вроде "14,3"


0
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

Результат = 1,00


1
DateDiff () возвращает int. Вы можете преобразовать его в десятичное число, но мантисса уже усечена.
Joel Coehoorn

0

Вероятно, вы ищете функцию РАЗНДАТ .

РАЗНДАТ (часть даты, начальная дата, конечная дата)

Код может выглядеть так:

РАЗНДАТ (чч, начальная дата, конечная дата)


1
Интервал «чч» не сделает то, что он хочет. Ему нужен меньший интервал, чтобы он мог вычислять дробные часы.
Joel Coehoorn

0
DATEDIFF(minute,startdate,enddate)/60.0)

Или используйте это для двух знаков после запятой:

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))

-1

ВЫБЕРИТЕ DATEDIFF (чч, firstDate, secondDate) FROM tableName WHERE ...


DateDiff () возвращает int. Вы можете преобразовать его в десятичное число, но мантисса уже усечена.
Джоэл Кохорн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.