2

我在 SQL Server 2005 中有一个带有复合主键的表,即外键 (INT) 和 DateTime 列。

当我运行 SQL 时,

Select column1 From TABLE where ForeignKey=1 and DateTime='08/26/2010 11:24:36'

有记录时没有返回记录。

一种选择是

Select column1 From TABLE where ForeignKey=1 and DateTime>='08/26/2010 11:24:36' and DateTime<'08/26/2010 11:24:37'

但是,看起来……我真的必须求助于这个吗?还是因为我必须指定直到毫秒?或者有什么解决办法吗?

请帮忙。提前致谢。

4

2 回答 2

2

是的,您必须将 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'
于 2010-08-26T13:37:47.347 回答
0

如果可能的话,不要使用日期时间字段作为您的密钥。而是创建一个不同的键并简单地索引您的日期时间值。

于 2010-08-30T14:56:10.377 回答