Ihr Vergleich funktioniert, ist aber langsam, da die Daten für jede Zeile in eine Zeichenfolge konvertiert werden. Um zwei Zeitabschnitte effizient zu vergleichen, versuchen Sie Folgendes:
declare @first datetime
set @first = '2009-04-30 19:47:16.123'
declare @second datetime
set @second = '2009-04-10 19:47:16.123'
select (cast(@first as float) - floor(cast(@first as float))) -
(cast(@second as float) - floor(cast(@second as float)))
as Difference
Lange Erklärung:Ein Datum im SQL-Server wird als Gleitkommazahl gespeichert. Die Ziffern vor dem Dezimalpunkt stellen das Datum dar. Die Ziffern nach dem Komma stellen die Uhrzeit dar.
Hier ist ein Beispieldatum:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Konvertieren wir es in ein Float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Nehmen Sie nun den Teil nach dem Kommazeichen, also die Uhrzeit:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Konvertieren Sie es zurück in eine Datumszeit:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
Der 1.1.1900 ist nur das "Null"-Datum; Sie können den Zeitteil mit convert anzeigen, indem Sie beispielsweise das Format 108 angeben, das nur die Zeit ist:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Konvertierungen zwischen datetime und float sind ziemlich schnell, da sie grundsätzlich auf die gleiche Weise gespeichert werden.