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

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

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

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

Ответ 1

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

Ответ 2

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

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

Тест script может быть:

  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

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

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

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

Ответ 3

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

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

Ответ 4

Возможно, вы ищете функцию DATEDIFF.

DATEDIFF (datepart, startdate, enddate)

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

DATEDIFF (hh, startdate, enddate)

Ответ 5

DATEDIFF(minute,startdate,enddate)/60.0)

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

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

Ответ 6

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

Ответ 7

SELECT DATEDIFF (hh, firstDate, secondDate) FROM tableName ГДЕ...