Sql server 2005 SQL Server 2005中的毫秒分隔符错误

Sql server 2005 SQL Server 2005中的毫秒分隔符错误,sql-server-2005,datetime,Sql Server 2005,Datetime,我真的不明白为什么指令选择CONVERT(例如,NVARCHAR(30),GETDATE(),114)输出 13:04:31:997 而不是 13:04:31.997 为什么毫秒分隔符a:代替了?如果您需要知道,我需要能够检查某个时间是否介于以XML形式存储在表中的两个时间值之间。问题是,此表中的分隔符通常是,因此在两种格式之间进行比较会返回错误的结果,因为一种使用,另一种使用:。是否有任何方法可以使用分隔符获取时间,而无需使用REPLACE之类的字符串函数或不更改表中存储的格式?这正是样式

我真的不明白为什么指令
选择CONVERT(例如,NVARCHAR(30),GETDATE(),114)
输出

13:04:31:997
而不是

13:04:31.997
为什么毫秒分隔符a
代替了
?如果您需要知道,我需要能够检查某个时间是否介于以XML形式存储在表中的两个时间值之间。问题是,此表中的分隔符通常是
,因此在两种格式之间进行比较会返回错误的结果,因为一种使用
,另一种使用
。是否有任何方法可以使用
分隔符获取时间,而无需使用
REPLACE
之类的字符串函数或不更改表中存储的格式?

这正是样式114的含义:

hh:mi:ss:mmm(24小时)


我不知道有什么办法可以改变所用的分离器。我建议将XML格式的值转换为datetime,而不是将当前日期转换为文本值。毕竟,您在逻辑上比较的是日期和时间,而不是字符串。

我认为在进行比较时,您应该尝试将格式保持为
datetime
。在SQLServer2008中,有一种新的数据类型
time
,这可能会有所帮助,但在SQLServer2005中,我们必须使用
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
ID
1
使用
.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')  

您是对的,但是字符串排序给出了完全相同的结果,这就是我使用它的原因。@SQL:但是通过转换为另一种方式,您不需要担心格式设置为字符串。通常,这是一种更好的方法—将数据转换为最符合逻辑的数据格式,而不是远离它。