Как рассчитать разницу в часах (десятичных) между двумя датами в 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
просто вычесть два значения даты и времени и умножить на 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
Comments