是的,您必须将 DateTime 值的精度与毫秒匹配才能使相等性起作用。
您提出的替代方案将起作用。作为另一个想法,您可以使用强制转换和转换将存储的日期时间截断到秒。但是请注意,在 where 子句中使用这些函数将使优化器无法使用 datetime 列上的任何索引。您必须决定这会对您的特定环境产生什么影响。
/* CONVERT style 20 is yyyy-mm-dd hh:mi:ss */
Select column1
From TABLE
where ForeignKey=1
and CAST(CONVERT(char(19),DateTime,20) as datetime) = '08/26/2010 11:24:36'
编辑:跟进下面的评论,我注意到 SQL Server 在比较中似乎没有发现 1 毫秒的差异。这在 2000/2005/2008 环境中是正确的。如果我在 2008 年使用新的datetime2数据类型,那么它会按预期工作。读取datetime数据类型,毫秒部分的精度四舍五入:
精度:四舍五入到 0.000、0.003 或 0.007 秒的增量
declare @datetime1 datetime
declare @datetime2 datetime
declare @datetime3 datetime
declare @datetime4 datetime
set @datetime1 = '2010-08-30 08:41:51.513'
set @datetime2 = '2010-08-30 08:41:51.513'
set @datetime3 = '2010-08-30 08:41:51.514'
set @datetime4 = '2010-08-30 08:41:51.515'
/* Expected result 'Equal'; Actual result 'Equal' */
if @datetime1 = @datetime2
print 'Equal'
else
print 'Not Equal'
/* Expected result 'Not Equal'; Actual result 'Equal' */
if @datetime1 = @datetime3
print 'Equal'
else
print 'Not Equal'
/* Expected result 'Not Equal'; Actual result 'Not Equal' */
if @datetime1 = @datetime4
print 'Equal'
else
print 'Not Equal'