使用Between之间的SQL查询日期搜索

时间:2013-08-07 05:11:27

标签: sql sql-server sql-server-2012-express

我只是运行此查询

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版。

3 个答案:

答案 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
   例如:

SQL Fiddle

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.0002012-09-25 13:00:00.000

之间的值