您的比较会起作用,但速度会很慢,因为每一行的日期都转换为字符串。要有效地比较两个时间部分,请尝试:
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 Server 中的日期存储为浮点数。小数点前的数字代表日期。小数点后的数字代表时间。
所以这里是一个示例日期:
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 只是“零”日期;您可以使用 convert 显示时间部分,例如指定格式 108,这就是时间:
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
datetime 和 float 之间的转换非常快,因为它们的存储方式基本相同。