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



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



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

может кто-нибудь помочь мне с этим?



обновление:

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

1233   8  

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

просто вычесть два значения даты и времени и умножить на 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) From имя_таблицы ГДЕ...

Comments

    Ничего не найдено.