2017-06-08 19 views
0

データが格納されている特定の日付範囲の間のすべてのレコードを見つける最も正確で効率的な方法を調べようとしていますDATETIME2(3)フォーマット。日付範囲の間でレコードを見つける最も正確な方法

SET STATISTICS IO ON; 
DECLARE @StartDate  DATE = '5/1/2017', 
    @EndDate   DATE = '5/31/2017', 
    @PrevDayStartDate DATE, 
    @NextDayEndDate DATE; 

SET @PrevDayStartDate = DATEADD(DAY, -1, @StartDate); 
SET @NextDayEndDate = DATEADD(DAY, 1, @EndDate); 

SELECT COUNT(*) AS [Using Dates] 
FROM dbo.ccis_11001 
WHERE ldstat_date >= @StartDate AND ldstat_date <= @EndDate; 

SELECT COUNT(*) AS [DATEADD] 
FROM dbo.ccis_11001 
WHERE ldstat_date > @PrevDayStartDate AND ldstat_date < @NextDayEndDate; 

SELECT COUNT(*) AS [Mixture] 
FROM dbo.ccis_11001 
WHERE ldstat_date >= @StartDate AND ldstat_date < @NextDayEndDate; 

SELECT COUNT(*) AS [Cast Date] 
FROM dbo.ccis_11001 
WHERE CAST(ldstat_date AS DATE) >= @StartDate AND CAST(ldstat_date AS DATE) <= @EndDate; 

次は、クエリからの統計です:

Table 'ccis_11001'. Scan count 9, logical reads 152039, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ccis_11001'. Scan count 9, logical reads 153963, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ccis_11001'. Scan count 9, logical reads 153896, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ccis_11001'. Scan count 1, logical reads 125678, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

おそらく、私は完全にこれらの結果を読む方法を理解していないが、私が見つかりました。ここで

は、私がテストしてい4つのクエリがありますWHERE句で2つのCASTSを使用する問合せでは、他の3つの問合せよりスキャンと論理読取りが少なくなります。

しかし、CASTSを使用したクエリの実行には3つ以上のコストがかかります。

enter image description here

しかし、私のポストの理由は、私が引くか、元の日付パラメータに日追加したクエリのカウントは2と一致していないということです:最初の3は同じ正確な計画を有します続くクエリ。私は最初のクエリがDATETIME2(3)フィールドの秒数を計算しないことに基づいて異なるカウントを返す理由を理解していますが、リストされた2番目のクエリは3番目と4番目のクエリとは異なる結果を返します。

結果:

Using Dates DATEADD Mixture Cast Date 
14394305  14482319 14478923 14478923 

答えて

0

は実は、私はcencernのあなたの問題は、データ型であるべきだと思います。 00.000

  • DATETIMEはミリ秒2017年5月31日件まであなたに精度を与える:00:

    1. DATEはDATETIME2はあなたにマイクロ2017年5月31日00件まで精度を与える日2017年5月31日
    2. 件まであなたの精度を提供します00:00:00.0000000

    は、すべてのcomparisionsに、境界日付は、DATEデータ型であることから、しかしldstat_dateはDATETIME2データ型である、ldstat_dateは 'HH/MM/ss.mmmmmm' 部分にいくつかの値を有することができます。これは、読んだレコードの違いを引き起こしている可能性があります。これをチェックしてください。

  • 関連する問題