2011-06-19 37 views
1

我實在想不通爲什麼指令SELECT CONVERT(NVARCHAR(30), GETDATE(), 114)輸出,例如,錯誤毫秒分離器在SQL Server 2005

13:04:31:997 

代替

13:04:31.997 

爲什麼毫秒分離器: insted的的.?如果您需要知道,我需要能夠檢查在表格中以XML格式存儲的兩個時間值之間是否存在特定時間。問題是,此表中的分隔符(對我來說是正常的)爲.,因此使用兩種格式之間的比較會返回錯誤的結果,因爲一個使用.,另一個使用:。有沒有什麼辦法可以在不使用字符串函數REPLACE的情況下使用.分隔符來獲取時間,或者不更改表中存儲的格式?

回答

1

我想你應該儘量保持格式爲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 
2

這正是the documentation說樣式114:

HH:MI:SS:MMM(24小時)

我不知道的改變所使用的分離器的任何方式。我建議將XML格式的值轉換爲日期時間,而不是將當前日期轉換爲文本值。畢竟,你在邏輯上比較日期和時間,而不是字符串。

+0

你是對的,但串排序恰恰給出了相同的結果,這就是爲什麼我使用它。 –

+0

@SQL:但是通過另一種方式轉換,您不必擔心格式化爲字符串。這通常是更好的方法 - 將數據*轉換爲最合乎邏輯的數據格式,而不是遠離它。 –