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.

Marc
źródło

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

Phil Ross
źródło
Ś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.

Charles Bretana
źródło
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
AnthonyWJones
źródło
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”

Patrick Kearns
źródło
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

Ta01
źródło
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)

Vincent Ramdhanie
źródło
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))
umysł
źródło
-1

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

LorettoDave
źródło
DateDiff () zwraca int. Możesz rzucić do ułamka dziesiętnego, ale mantysa jest już obcięta.
Joel Coehoorn