So sánh của bạn sẽ hoạt động, nhưng sẽ chậm vì ngày tháng được chuyển đổi thành một chuỗi cho mỗi hàng. Để so sánh hiệu quả hai phần thời gian, hãy thử:
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
Giải thích dài:một ngày trong máy chủ SQL được lưu trữ dưới dạng số dấu phẩy động. Các chữ số trước dấu thập phân đại diện cho ngày tháng. Các chữ số sau dấu thập phân thể hiện thời gian.
Vì vậy, đây là một ngày ví dụ:
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Hãy chuyển nó thành float:
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Bây giờ hãy lấy một phần sau ký tự dấu phẩy, tức là thời gian:
set @myfloat = @myfloat - floor(@myfloat)
select @myfloat
-- Shows 0,824492168212601
Chuyển nó trở lại ngày giờ:
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
1900-01-01 chỉ là ngày "số không"; bạn có thể hiển thị phần thời gian với chuyển đổi, chỉ định định dạng ví dụ 108, chỉ là thời gian:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Chuyển đổi giữa datetime và float khá nhanh vì về cơ bản chúng được lưu trữ theo cùng một cách.