Як розрахувати різницю в годинах (десяткових) між двома датами в SQL Server?


84

Мені потрібно обчислити різницю в годинах (десятковий тип) між двома датами в SQL Server 2008.

Я не зміг знайти жодної корисної техніки для перетворення дати та часу в десяткову за допомогою 'CONVERT' на MSDN.
Хто-небудь може мені допомогти в цьому?

ОНОВЛЕННЯ:
Щоб бути зрозумілим, мені потрібна також дробова частина (отже, десятковий тип). Тож з 9:00 до 10:30 мені повинно повернути 1,5.

Відповіді:


162

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

Просто відніміть два значення дати і часу і помножте на 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 мілісекунди.


Хороший фокус. 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. Ви можете передати десятковий знак, але це вже усічено мантису.
Джоел Коухорн,

0

Ви, мабуть, шукаєте функцію DATEDIFF .

DATEDIFF (дата, початок, дата закінчення)

Де ви можете виглядати так:

DATEDIFF (год, дата початку, дата закінчення)


1
Інтервал "hh" не буде робити те, що він хоче. Йому потрібен менший інтервал, щоб він міг обчислити дробові години.
Джоел Коухорн,

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

Або використовуйте це для 2 знаків після коми:

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

-1

ВИБЕРІТЬ DATEDIFF (hh, firstDate, secondDate) ІЗ таблиці ІЗ ДЕ ...


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