Porównanie będzie działać, ale będzie powolne, ponieważ daty są konwertowane na ciąg dla każdego wiersza. Aby skutecznie porównać dwie części czasu, spróbuj:
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
Długie wyjaśnienie:data w serwerze SQL jest przechowywana jako liczba zmiennoprzecinkowa. Cyfry przed przecinkiem reprezentują datę. Cyfry po przecinku reprezentują czas.
Oto przykładowa data:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Przekształćmy to w pływak:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Teraz weź udział po przecinku, czyli czas:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Konwertuj go z powrotem na datę i godzinę:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
1900-01-01 to po prostu data „zero”; możesz wyświetlić część czasu z konwersją, określając na przykład format 108, który jest tylko czasem:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Konwersje między datetime i float są dość szybkie, ponieważ są one zasadniczo przechowywane w ten sam sposób.