Jak obliczyć różnicę w godzinach (dziesiętnie) między dwiema datami w SQL Server?


84

Muszę obliczyć różnicę w godzinach (typ dziesiętny) między dwiema datami w SQL Server 2008.

Nie mogłem znaleźć żadnej użytecznej techniki konwersji daty i godziny na liczbę dziesiętną za pomocą opcji „CONVERT” w witrynie MSDN.
Czy ktoś może mi w tym pomóc?

AKTUALIZACJA:
Aby było jasne, potrzebuję również części ułamkowej (czyli typu dziesiętnego). Czyli od 9:00 do 10:30 powinno mi zwrócić 1,5.

Odpowiedzi:


162

DATEDIFF(hour, start_date, end_date)poda liczbę godzin przekroczonych między start_datea end_date.

Jeśli potrzebujesz liczby ułamków godzin, możesz użyć DATEDIFFwyższej rozdzielczości i podzielić wynik:

DATEDIFF(second, start_date, end_date) / 3600.0

Dokumentacja DATEDIFFjest dostępna w witrynie MSDN:

http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx


Świetny pomysł. BTW - te same funkcje istnieją również w .Net, więc jest to przydatne w VB.Net lub C #.
Jeff

1
Dlaczego nie DATEDIFF (MINUTA, data_początkowa, data_końcowa) / 60.0
irfandar

8
@irfandar datepartPrzekazane do DATEDIFFbędzie sterować rozdzielczością wyjścia. Na przykład, jeśli start_datei end_dateróżni się o 59 sekund, DATEDIFF(MINUTE, start_date, end_date) / 60.0zwróci 0, ale DATEDIFF(second, start_date, end_date) / 3600.0zwróci 0,0163888 (59/3600).
Phil Ross

rozwiązanie to po prostu zwraca liczbę całkowitą. jeśli różnica czasu wynosi tylko 15 minut, godzina zwraca 0. Myślę, że poniższe rozwiązanie jest bardziej realistyczne.
Asad Naeem

1
@AsadNaeem Rozwiązanie (przy DATEDIFFrozdzielczości wyższej niż godzina) działa. Na przykład SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0zwraca 0,250000.
Phil Ross

15

Po prostu odejmij dwie wartości daty i godziny i pomnóż przez 24:

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

skrypt testowy może wyglądać następująco:

  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

Działa to, ponieważ wszystkie daty są przechowywane wewnętrznie jako para liczb całkowitych, pierwsza liczba całkowita to liczba dni od 1 stycznia 1900 r., A druga liczba całkowita (reprezentująca czas) to liczba ( 1 ) taktów od północy. (W przypadku SmallDatetimes liczba całkowita części czasu to liczba minut od północy). Wszelkie działania arytmetyczne na wartościach wykorzystują czas jako ułamek dnia. 6 rano = 0,25, południe = 0,5, itd ... Zobacz łącze MSDN tutaj, aby uzyskać więcej informacji.

Więc Cast ((@ Dt2 - @ Dt1) as Float) daje całkowitą liczbę dni między dwoma datami. Pomnóż przez 24, aby zamienić na godziny. Jeśli potrzebujesz całkowitej liczby minut, Wiele minut dziennie (24 * 60 = 1440) zamiast 24 ...

UWAGA 1 : To nie to samo, co znacznik dotNet lub javaScript - ten czas tikowania wynosi około 3,33 milisekundy.


Niezła sztuczka. SQL powinien zawierać nazwaną stałą. Czułem się brudny, kiedy pisałem 24, ale wydaje mi się, że to właśnie dostaję, bo nie jestem Ronaldem McDonaldem.
Allen

10

DATEDIFF, ale zwróć uwagę, że zwraca liczbę całkowitą, więc jeśli potrzebujesz ułamków godzin, użyj czegoś takiego: -

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

2

Używając Postgres, miałem problemy z DATEDIFF, ale udało mi się to:

  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

co dało mi wynik typu „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

Wynik = 1,00


1
DateDiff () zwraca int. Możesz rzucić do ułamka dziesiętnego, ale mantysa jest już obcięta.
Joel Coehoorn

0

Prawdopodobnie szukasz funkcji DATEDIFF .

DATEDIFF (część daty, data początkowa, data końcowa)

Miejsce, w którym kod może wyglądać następująco:

DATEDIFF (gg; data początkowa; data końcowa)


1
Interwał „hh” nie zrobi tego, czego chce. Potrzebuje mniejszego przedziału czasu, aby mógł obliczyć ułamki godzin.
Joel Coehoorn

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

Lub użyj tego dla 2 miejsc po przecinku:

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

-1

SELECT DATEDIFF (hh, firstDate, secondDate) FROM tableName WHERE ...


DateDiff () zwraca int. Możesz rzucić do ułamka dziesiętnego, ale mantysa jest już obcięta.
Joel Coehoorn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.