Uw vergelijking zal werken, maar het zal traag zijn omdat de datums voor elke rij worden geconverteerd naar een tekenreeks. Probeer om twee tijdsdelen efficiënt te vergelijken:
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 uitleg:een datum in SQL-server wordt opgeslagen als een getal met drijvende komma. De cijfers voor de komma vertegenwoordigen de datum. De cijfers achter de komma vertegenwoordigen de tijd.
Dus hier is een voorbeelddatum:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Laten we het omzetten in een float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Neem nu het gedeelte na de komma, d.w.z. de tijd:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Zet het terug naar een datetime:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
De 1900-01-01 is slechts de "nul"-datum; je kunt het tijdsgedeelte weergeven met converteren, waarbij je bijvoorbeeld het formaat 108 specificeert, wat precies de tijd is:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Conversies tussen datetime en float zijn vrij snel, omdat ze in principe op dezelfde manier worden opgeslagen.