我想你应该尽量保持格式为datetime
当你做比较时。在SQL Server 2008中,有一种新的数据类型time
,它可能会有所帮助,但在SQL Server 2005中,我们必须使用datetime
来代替。
我想你使用的是convert(..., 114)
只能从datetime
变量中得到时间部分。您可以使用此代码删除日期部分,并仍然有一个datetime
变量。
declare @dt datetime
set @dt = '2001-01-01T10:01:02.000'
select dateadd(d, datediff(d, @dt, 0), @dt)
结果:
1900-01-01 10:01:02.000
当您提取使用.value
您指定的数据类型的XML数据使用。如果您只有XML中的时间部分,并且指定了datetime
,则将获得日期'1900-01-01'的时间。所以你可以使用这样的datetime
做比较。
declare @T table (ID int, XMLCol xml)
insert into @T
select 1, '<t1>10:01:01.123</t1><t2>10:01:02.123</t2>' union all
select 2, '<t1>11:01:01.123</t1><t2>11:01:02.123</t2>'
declare @dt datetime
set @dt = '2001-01-01T10:01:02.000'
select T.ID
from @T as T
where dateadd(d, datediff(d, @dt, 0), @dt) between
T.XMLCol.value('t1[1]', 'datetime') and
T.XMLCol.value('t2[1]', 'datetime')
结果:
ID
1
你是对的,但串排序恰恰给出了相同的结果,这就是为什么我使用它。 –
@SQL:但是通过另一种方式转换,您不必担心格式化为字符串。这通常是更好的方法 - 将数据*转换为最合乎逻辑的数据格式,而不是远离它。 –