Wie berechnet man die Differenz in Stunden (dezimal) zwischen zwei Daten in SQL Server?

84

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 eine Dezimalzahl umzuwandeln.
Kann mir jemand dabei helfen?

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

Marc
quelle

Antworten:

161

DATEDIFF(hour, start_date, end_date)gibt Ihnen die Anzahl der Stundengrenzen, die zwischen start_dateund überschritten werden end_date.

Wenn Sie die Anzahl der Bruchstunden benötigen, können Sie DATEDIFFeine höhere Auflösung verwenden und das Ergebnis teilen:

DATEDIFF(second, start_date, end_date) / 3600.0

Die Dokumentation zu DATEDIFFist auf MSDN verfügbar:

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

Phil Ross
quelle
Großartige Idee. Übrigens - die gleichen Funktionen gibt es auch in .Net, daher ist dies in VB.Net oder C # nützlich.
Jeff
1
Warum nicht DATEDIFF (MINUTE, start_date, end_date) / 60.0
irfandar
8
@irfandar Das datepartübergeben an DATEDIFFsteuert die Auflösung der Ausgabe. Wenn zum Beispiel start_dateund end_datevon 59 Sekunden unterscheiden, dann DATEDIFF(MINUTE, start_date, end_date) / 60.0würde 0 zurück, aber DATEDIFF(second, start_date, end_date) / 3600.0zurückkehren würde 0,0163888 (59/3600).
Phil Ross
Diese Lösung gibt nur die Ganzzahl zurück. Wenn der Zeitunterschied nur 15 Minuten beträgt, gibt die Stunde 0 zurück. Ich denke, die folgende Lösung ist realistischer.
Asad Naeem
1
@AsadNaeem Die Lösung (mit DATEDIFFeiner höheren Auflösung als Stunde) funktioniert. SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0Gibt beispielsweise 0,250000 zurück.
Phil Ross
15

Subtrahieren Sie einfach die beiden Datums- / Uhrzeitwerte 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 Datenzeiten intern als Paar von Ganzzahlen gespeichert werden, 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 ist. (Für SmallDatetimes ist die Zeitanteils-Ganzzahl die Anzahl der Minuten seit Mitternacht). Jede Arithmetik, die mit den Werten durchgeführt wird, verwendet den Zeitanteil als Bruchteil eines Tages. 6 Uhr morgens = 0,25 Uhr, 12 Uhr mittags = 0,5 Uhr usw. Weitere Informationen finden Sie hier unter MSDN-Link .

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

HINWEIS 1 : Dies ist nicht dasselbe wie ein dotNet- oder JavaScript-Tick - dieser Tick beträgt ungefähr 3,33 Millisekunden.

Charles Bretana
quelle
Guter Trick. SQL sollte eine benannte Konstante enthalten. Ich fühlte mich schmutzig, als ich 24 tippte, aber ich denke, das ist es, was ich bekomme, wenn ich nicht Ronald McDonald bin.
Allen
10

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

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

Mit Postgres hatte ich Probleme mit DATEDIFF, hatte 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"

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

Ergebnis = 1,00

Ta01
quelle
1
DateDiff () gibt ein int zurück. Sie könnten auf Dezimalzahl umwandeln, aber die Mantisse ist bereits abgeschnitten.
Joel Coehoorn
0

Sie suchen wahrscheinlich nach der DATEDIFF- Funktion.

DATEDIFF (Datumsteil, Startdatum, Enddatum)

Wo Ihr Code so aussehen könnte:

DATEDIFF (hh, Startdatum, Enddatum)

Vincent Ramdhanie
quelle
1
Das 'hh'-Intervall wird nicht tun, was er will. Er benötigt ein kleineres Intervall, um Bruchstunden berechnen zu können.
Joel Coehoorn
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))
Verstand
quelle
-1

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

LorettoDave
quelle
DateDiff () gibt ein int zurück. Sie könnten auf Dezimalzahl umwandeln, aber die Mantisse ist bereits abgeschnitten.
Joel Coehoorn