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

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

Я не смог найти никакой полезной техники для преобразования datetime в decimal с помощью "CONVERT" на MSDN.
может кто-нибудь помочь мне с этим?

обновление:
Чтобы быть ясным, мне нужна дробная часть (таким образом, десятичный тип). Так, с 9:00 до 10:30 он должен вернуть мне 1.5.

8 ответов


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


просто вычесть два значения 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) как Float) дает вам общее количество дней между двумя датами. Умножить на 24, чтобы преобразовать в часов. Если вам нужно всего минут, несколько минут в день (24 * 60 = 1440) вместо 24...

Примечание 1: это не то же самое, что dotNet или javaScript ТИК - этого клеща составляет около 3,33 миллисекунды.


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

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

вы, вероятно, ищет функция datediff


DATEDIFF(minute,startdate,enddate)/60.0)

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

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,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"


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


выберите DATEDIFF(hh, firstDate, secondDate) Из tableName ГДЕ...