web-dev-qa-db-de.com

Wie berechnet man den Stundenunterschied (dezimal) zwischen zwei Daten in SQL Server?

Ich muss die Differenz in Stunden (Dezimaltyp) zwischen zwei Daten in SQL Server 2008 berechnen.

Ich konnte keine nützliche Technik finden, um datetime mit 'CONVERT' auf MSDN in dezimal umzuwandeln.
Kann mir jemand dabei helfen?

AKTUALISIEREN:
Um klar zu sein, brauche ich auch den Bruchteil (also den Dezimaltyp). Also von 9:00 bis 10:30 sollte es mir 1.5 zurückgeben.

75
Marc

DATEDIFF(hour, start_date, end_date) gibt die Anzahl der Stundengrenzen an, die zwischen start_date und end_date überschritten wurden.

Wenn Sie die Anzahl der Bruchstunden benötigen, können Sie DATEDIFF mit einer höheren Auflösung verwenden und das Ergebnis teilen:

DATEDIFF(second, start_date, end_date) / 3600.0

Die Dokumentation für DATEDIFF ist auf MSDN verfügbar:

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

146
Phil Ross

Subtrahieren Sie einfach die beiden datetime-Werte und multiplizieren Sie sie mit 24:

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

ein Testskript könnte sein:

  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

Dies funktioniert, weil alle Daten intern als Ganzzahlpaar gespeichert sind, die erste Ganzzahl die Anzahl der Tage seit dem 1. Januar 1900 und die zweite Ganzzahl (die die Zeit darstellt) die Anzahl der 1 ) ticks seit Mitternacht. (Für SmallDatetimes ist die Ganzzahl des Zeitabschnitts die Anzahl der Minuten seit Mitternacht.) Bei jeder Berechnung der Werte wird der Zeitanteil als Bruchteil eines Tages verwendet. 6 Uhr morgens = 0,25 Uhr mittags = 0,5 Uhr usw. Weitere Informationen finden Sie unter MSDN-Link hier .

Cast ((@ Dt2 - @ Dt1) als Float) gibt Ihnen also insgesamt Tage zwischen zwei Datumsangaben. Mit 24 multiplizieren, um in Stunden umzurechnen. Wenn Sie Gesamtminuten benötigen, können Sie anstelle von 24 Minuten auch mehrere Minuten pro Tag (24 * 60 = 1440) eingeben.

HINWEIS 1 : Dies ist nicht dasselbe wie ein DotNet- oder JavaScript-Häkchen - dieses Häkchen beträgt etwa 3,33 Millisekunden.

14
Charles Bretana

DATEDIFF, aber beachten Sie, dass es eine Ganzzahl zurückgibt. Wenn Sie Bruchteile von Stunden benötigen, verwenden Sie Folgendes:

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

Bei der Verwendung von Postgres hatte ich Probleme mit DATEDIFF, aber Erfolg damit:

  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

das gab mir eine Ausgabe wie "14.3"

2
Patrick Kearns
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

Ergebnis = 1,00

0
kd7

Sie suchen wahrscheinlich nach der Funktion DATEDIFF .

DATEDIFF (Datumsteil, Startdatum, Enddatum)

Wo könnte Ihr Code so aussehen:

DATEDIFF (hh, Startdatum, Enddatum)

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

Oder verwenden Sie dies für 2 Dezimalstellen:

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