Ваш сравнить будет работать, но это будет происходить медленно, потому что даты преобразуются в строку для каждой строки. Для эффективного сравнения двух временных частей, попробуйте:
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
Long Объяснение: дата в сервере SQL хранится в виде числа с плавающей точкой. Цифры до десятичной точки представляют собой дату. Цифры после десятичной точки представляют время.
Так вот дата пример:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Давайте преобразуем его к поплавку:
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 - это только «нулевая» дата; Вы можете отобразить часть времени с новообращенным, указав, например, формат 108, который только время:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
преобразований между DateTime и поплавком довольно быстро, потому что они в основном хранятся таким же образом.
Почему я должен преобразовать в VARCHAR, так что я могу сравнить, если время больше, чем другой? Разве я не сравню строку со строкой? – AndreMiranda
Функция DateDiff принимает поля datetime в качестве входных данных, так что вы получите над горбом. – Eric