我只是运行此查询
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版。
答案 0 :(得分: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
DATETIME与DATETIME2:
SELECT name, [precision]
FROM sys.types
WHERE name IN ('datetime', 'datetime2')
<强>输出:强>
name precision
----------- ---------
datetime2 27
datetime 23
答案 1 :(得分:4)
您已将Datetime
作为数据类型,并且具有舍入的属性。
Datetime
值四舍五入为.000,.003或.007秒的增量。详情here
例如:
MS SQL Server 2012架构设置:
查询1 :
Declare @testtime datetime = '2012-09-25 12:59:59.999'
select @testtime
<强> Results 强>:
| COLUMN_0 |
------------------------------------
| September, 25 2012 13:00:00+0000 |
答案 2 :(得分: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