2

以下のように2つの同じクエリ(「MonthName Year」とカウント)を返しますが、WHERE条件の日付範囲のみが異なります。クエリー1は6月の月カウントのみを取得し、クエリー2は4月から7月にカウントを取得します。クエリ2の6月のカウントはクエリー1の6月のカウントと同じではありません。SQL Server - WHERE日付範囲とGROUP BY MonthName

クエリ1:

SELECT DATENAME(MONTH, SubmissionDate) + ' ' + DateName(Year, SubmissionDate) AS MonthNumber, COUNT(1) AS InquiryCount 
, Cast(Datename(MONTH,SubmissionDate) + ' ' + Datename(YEAR,SubmissionDate) AS DATETIME) AS tmp 
    FROM [dbo].[InvestigationDetails] (nolock) 
    WHERE SubmissionDate>= '06/01/2016' 
    AND SubmissionDate <= '06/30/2016' 
    GROUP BY DATENAME(MONTH, SubmissionDate) + ' ' + DateName(Year, SubmissionDate), DateName(Year, SubmissionDate) 
    ORDER BY tmp ASC 

クエリ2:

SELECT DATENAME(MONTH, SubmissionDate) + ' ' + DateName(Year, SubmissionDate) AS MonthNumber, DateName(Year, SubmissionDate), COUNT(1) AS InquiryCount 
, Cast(Datename(MONTH,SubmissionDate) + ' ' + Datename(YEAR,SubmissionDate) AS DATETIME) AS tmp 
    FROM [dbo].[InvestigationDetails] (nolock) 
    WHERE SubmissionDate>= '04/01/2016' 
    AND SubmissionDate <= '07/31/2016' 
    GROUP BY DATENAME(MONTH, SubmissionDate) + ' ' + DateName(Year, SubmissionDate), DateName(Year, SubmissionDate) 
    ORDER BY tmp ASC 

おかげで、 ジェイ

+0

第1のクエリの6月データは、第2のクエリとどのように異なっていますか? – Santi

+0

クエリ1が返されます:2016年6月 - 290&クエリ2は、2016年6月のクエリ307を返します。助言してください。 – Jay

+0

データを再生して何が起こっているのかを確認する必要がありますが、問題を解決するには最初のクエリのwhere句を変更してください:DATENAME(MONTH、SubmissionDate)= 'June' ....ここでもあなたに以前と同じ結果です。また、SubmissionDate DateTimeフィールドまたはvarcharですか? – objectNotFound

答えて

1

SubmissionDateタイプDATETIMEでなければなりませんので、あなたはあなたの最後の日のためのすべての値が欠落しています、06/30/2016、これは06/30/2016 00:00:00に等しいためです。つまり、SubmissionDateのレコードがtime > 00:00:00 on 6/30/2016のレコードは除外されます。たとえば、6/30/2016 12:44:22は、現在のロジックの結果には含まれません。

利用の代わりにこれらの1:

  1. AND SubmissionDate < '07/01/2016'
  2. AND SubmissionDate <= '06/30/2016 23:59:59.999'

あなたが2016年7月1日前に、すべてのレコードを取得するため、第1の方法は6/30/2016 23:59:59.999を含む、好ましいです。もちろん、DATETIMEがどれくらい正確にSQL Serverに存在するかを認識しておく必要があります。以下のコードを実行して、私の言いたいことを確認してください。

declare @dt datetime2 = getdate() 
select @dt   --more precise with datetime2 
select getdate() --not as precise