我想你應該儘量保持格式爲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:但是通過另一種方式轉換,您不必擔心格式化爲字符串。這通常是更好的方法 - 將數據*轉換爲最合乎邏輯的數據格式,而不是遠離它。 –