7

我只是运行这个查询

Select * 
from ProjectData 
where logtime between '2012-09-25 12:00:00.000' and '2012-09-25 12:59:59.999' 
order by LogTime

为了找到 12 小时的所有记录,我们每秒都有记录,所以我期待 3600 条记录,但令我惊讶的是,我得到了 3601 条记录,最后记录时间是

2012-09-25 13:00:00.000

知道为什么选择这个记录吗?即使Between包含给定值,该值也高于条件。我正在使用 SQL Server 2012 Express 版本。

4

3 回答 3

9

尝试DATETIME2对列使用数据类型logtime-

询问:

DECLARE @temp TABLE (logtime DATETIME2)
INSERT INTO @temp (logtime)
VALUES 
    ('20120925 12:00:00.000'),
    ('20120925 12:59:59.999'),
    ('20120925 13:00:00.000')

SELECT *
FROM @temp
WHERE logtime BETWEEN '2012-09-25 12:00:00.000' AND '2012-09-25 12:59:59.999'
ORDER BY logtime

输出:

logtime
---------------------------
2012-09-25 12:00:00.0000000
2012-09-25 12:59:59.9990000

日期时间与日期时间 2:

SELECT name, [precision]
FROM sys.types
WHERE name IN ('datetime', 'datetime2')

输出:

name        precision
----------- ---------
datetime2   27
datetime    23
于 2013-08-07T05:21:10.327 回答
4

您已将Datetime其作为数据类型,并且它具有四舍五入的属性。

Datetime 值四舍五入到 0.000、0.003 或 0.007 秒的增量。这里有详细信息
例如:

SQL小提琴

MS SQL Server 2012 架构设置

查询 1

Declare @testtime datetime = '2012-09-25 12:59:59.999'

select @testtime

结果

|                         COLUMN_0 |
------------------------------------
| September, 25 2012 13:00:00+0000 |
于 2013-08-07T05:46:47.900 回答
1

尝试执行此查询

SELECT CAST('2012-09-25 12:59:59.999' AS DATETIME)

这将输出2012-09-25 13:00:00.000. 所以我认为这就是你的结果包含时间记录的原因2012-09-25 13:00:00.000

所以实际上它选择和之间 2012-09-25 12:00:00.000的值2012-09-25 13:00:00.000

于 2013-08-07T05:17:52.177 回答