Вашето сравнение ще работи, но ще бъде бавно, защото датите се преобразуват в низ за всеки ред. За да сравните ефективно две времеви части, опитайте:
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
Дълго обяснение:дата в SQL сървъра се съхранява като число с плаваща запетая. Цифрите преди десетичната запетая представляват датата. Цифрите след десетичната запетая представляват времето.
Ето примерна дата:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Нека го преобразуваме в float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Сега вземете частта след знака запетая, т.е. часа:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Преобразувайте го обратно в дата и час:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
1900-01-01 е просто "нулевата" дата; можете да покажете частта от времето с convert, като посочите например формат 108, което е точно времето:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Преобразуванията между datetime и float са доста бързи, защото основно се съхраняват по същия начин.