Differenz zwischen 2 Datumswerten

Hallo zusammen,

ich möchte in einer MS SQL Server 2005 Umgebung die Differenz zwischen 2 Datumswerten in Tagen, Stunden, Minuten und Sekunden ermitteln.
Die beiden Datumsfelder sind vom Datentyp datetime.
Ich habe dazu bereits ein Script geschrieben, bei dem ich mit datediff die Differenz zwischen den beiden Werten in Sekunden ermittle, und daraus dann die vollen Tage (= 86400 Sekunden) rausrechne, aus dem verbleibenden Rest die vollen Stunden (= 3600 Sekunden) ermittle, vom verbleibenden Rest die vollen Minuten ( = 60 Sekunden) ermittle usw.
Diese Lösung erscheint mir aber sehr kompliziert und ich bin der Meinung, dass es dafür auch eine einfachere Lösung in SQL geben muß. Vielleicht kann mir von Euch jemand einen Tipp geben. Danke!

Nachfolgend das von mir entwickelte Script:

select
Datumswert1
, Datumswert2
—Tage Ermittlung
, Convert(int, datediff(second, Datumswert1, Datumswert2)/ 86400) AS Tage
—Stunden Ermittlung
, Convert(int, (datediff(second, Datumswert1, Datumswert2) - (Convert(int, (datediff(second, Datumswert1, Datumswert2)/86400)) * 86400)) / 3600) AS Stunden
—Minuten-Ermittlung
, (
datediff(second, Datumswert1, Datumswert2) - ((Convert(int, (datediff(second, Datumswert1, Datumswert2)))/86400) * 86400)

  • ((datediff(second, Datumswert1, Datumswert2) - (Convert(int, (datediff(second, Datumswert1, Datumswert2)/86400)) * 86400)) / 3600) * 3600
    ) / 60 AS Minuten
    —Sekunden Ermittlung
    , (
    datediff(second, Datumswert1, Datumswert2)

((Convert(int, (datediff(second, Datumswert1, Datumswert2)))/86400) * 86400)

((datediff(second, Datumswert1, Datumswert2)

(Convert(int, (datediff(second, Datumswert1, Datumswert2)/86400)) * 86400)) / 3600) * 3600
)

((
datediff(second, Datumswert1, Datumswert2) - ((Convert(int, (datediff(second, Datumswert1, Datumswert2)))/86400) * 86400)

  • ((datediff(second, Datumswert1, Datumswert2) - (Convert(int, (datediff(second, Datumswert1, Datumswert2)/86400)) * 86400)) / 3600) * 3600
    ) / 60) * 60 AS Sekunden
    from
    Tabelle

Hi

ich möchte in einer MS SQL Server 2005 Umgebung die Differenz
zwischen 2 Datumswerten in Tagen, Stunden, Minuten und
Sekunden ermitteln.

dafür gibt es die Funktion DATEDIFF… Für dich wäre die Anwendung etwa die folgenden:

SELECT 
 date1,
 date2,
 CAST(DATEDIFF(d, date1, date2) AS NVARCHAR) + ' Tag(e), ' + --Tage
 CAST(DATEDIFF(h, date1, date2) AS NVARCHAR) + ':' + --Stunden
 CAST(DATEDIFF(n, date1, date2) AS NVARCHAR) + ':' + --Minuten
 CAST(DATEDIFF(s, date1, date2) AS NVARCHAR) AS 'Differenz' --Sekunden
FROM
 tabelle; 

Bedingung: date2 > date1

Grüße
m4tt3n

Hallo m4tt3n,

danke für Deine Antwort. Die Funktion Datediff ist mir schon bekannt. Ich verwende sie ja auch in meinem Script. Das Problem ist allerdings etwas komplexer. Ich will mir nicht einfach die Differenz zwischen zwei Datumswerten in unterschiedlichen Zeitgrößen ausgeben lassen, sondern ich will die Differenz umgerechnet haben in Tage, Stunden, Minuten und Sekunden. Am Verständlichsten wird’s vermutlich anhand eines Beispiels:

Datumswert 1 = 2009-03-26 00:06:53.130
Datumswert 2 = 2009-04-03 15:49:39.250

Ale Ergebnis erwarte ich nun:
8 Tage 15 Stunden 42 Minuten 46 Sekunden

Diese Ergebnis ermittelt mein Script auch. Ich vermute nur, dass mein Weg zu umständlich und damit auch unperformant ist.

Wenn ich die Datediff-Funktion wie von Dir vorgeschlagen verwende, erhaltet ich im Prinzip ja immer das gleiche Ergebnis:
8 Tage bzw.
207 Stunden bzw.
12463 Minuten bzw.
747766 Sekunden

Gruß
Markus

Hi

Diese Ergebnis ermittelt mein Script auch. Ich vermute nur,
dass mein Weg zu umständlich und damit auch unperformant ist.

Oops, da hab ich das wohl zu schnell überflogen und mich leicht mit der Datediff-Funktion vertan.

Ich glaub, Dir bleibt da nichts anderes übrig, als das so einzeln auszurechnen. Möglicherweise könntest du noch ein wenig Geschwindigkeit gewinnen, wenn Du die Funktionalität in eine Prozedur oder UDF kapselst.

Grüße
m4tt3n

Versuchs mal so:

–Ale Ergebnis erwarte ich nun:
–8 Tage 15 Stunden 42 Minuten 46 Sekunden
declare @dStartDate datetime, @dEndDate datetime, @iDiff int
– jjjj-dd-mm hh:mm:ss
set @dStartDate = cast(‚2009-03-04 14:00:00‘ as datetime)
set @dEndDate = cast ('2009-03-04 15:49:39’as datetime)

select @dStartDate
select @dEndDate
select @iDiff = (datediff(s, @dStartDate,@dEndDate))
select @iDiff

select 'Tage: ‚+ cast (@iDiff/84600 as varchar (10)) + ’ Stunden: ’ + cast (@iDiff/3600%24 as varchar (10))
+‘ Minuten: ’ + cast ((@iDiff/60)%60 as varchar (10)) + ’ Sekunden: ’ + cast (@iDiff%60 as varchar (10))

Hallo Lacrimula,

vielen Dank für Deine Antwort. Deine Lösung liefet auch das gewünschte Ergebnis, und ist zudem deutlich einfacher und verständlicher als mein Script.
Eine Verständnisfrage hätte ich aber noch:
was genau bewirkt z.B. der Zusatz %24 ??

Gruß
Markus

Hallo Markus,

iDiff/3600%24 bedeutet, dass ich die Sekunden in Anzahl der Stunden umrechnen lassen möchte und dann diese durch 24 teile (der Tag hat 24h) und den Restbetrag erhalte (% bzw. modulo).

25h % 24 sollte somit 1 ergeben oder 8 modulo 3 ist Rest 2, da 2*3 = 6 und bis zur 8 ein Rest von 2 bleibt.

viele Grüße,
Peter