2011-06-19 20 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:但是通过另一种方式转换,您不必担心格式化为字符串。这通常是更好的方法 - 将数据*转换为最合乎逻辑的数据格式,而不是远离它。 –