2017-09-02 10 views
0

は、私は、SQL Serverでこのクエリを持っている:このクエリのSQL Serverのdatetime型のフィルタクエリ

SELECT 
    [Order Date], SUM([Profit]) 
FROM 
    [sample].[dbo].[superstore] 
WHERE 
    [Order Date] BETWEEN '2012-06-21 00:00:00.000' AND '2012-09-21 23:59:59.999' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 

結果は2012-06-21 00:00:00.000

の[受注日]とが、このクエリ

SELECT 
    [Order Date], SUM([Profit]) 
FROM 
    [sample].[dbo].[superstore] 
WHERE 
    [Order Date] BETWEEN '2012-06-21 00:00:00.000' AND '2012-09-21 23:59:59.998' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 
でレコードを持っています

私はこのレコードを取得しません。

SQL Serverには、ここに不足しているプロパティがありますか?

ヒント:タイプ[Order Date]datetimeです。

+0

' DATETIME'の精度は3.33msであり、これらの奇妙な丸め効果が得られます。代わりに、SQL Server 2008で導入されたDATETIME2(n)、DATE、およびTIMEを使用することをお勧めしますこの奇妙な精度と丸めの問題はありません –

答えて

3

SQL Serverの日付/時刻列には、正確な型によって精度が異なります。最初は「0.999」が切り上げられています。

最も安全なアプローチのようなもので、betweenと時間のコンポーネントを避けることです:日付範囲のためのオペレータBETWEEN使用

SELECT [Order Date] , sum([Profit]) 
FROM [sample].[dbo].[superstore] 
WHERE [Order Date] >= '2012-06-21' AND 
     [Order Date] < '2012-09-22' 
GROUP BY [Order Date] 
ORDER BY [Order Date]; 
1

はあなたが見つけるしているとして、最初けどで魅力的なようで、それが頭痛の種です。次の書式に従うと、日付/時刻のデータ型に関係なく動作することがわかります。

注:どこの間にある論理> =と< =、我々は次の日の真夜中に、」終了日をシフトしている

SELECT 
    [Order Date], SUM(Profit) 
FROM 
    sample.dbo.superstore 
WHERE 
    [Order Date] >= '2012-06-21' 
    AND [Order Date] < '2012-09-22' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 
2

使用クエリの下には

SELECT 
    CAST([Order Date] AS date), 
    SUM([Profit]) 
FROM [sample].[dbo].[superstore] 
WHERE CAST([Order Date] AS date) BETWEEN '2012-06-21' AND '2012-09-21' 
GROUP BY CAST([Order Date] AS date) 
ORDER BY CAST([Order Date] AS date); 
関連する問題