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

DATETIME と DATETIME2:

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 値は、.000、.003、または .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 に答える