2

Ich habe 2 gleiche Abfragen (um "MonthName Jahr" zurückzugeben und zählen) wie unten, aber nur der Datumsbereich in der WHERE-Bedingung ist unterschiedlich. Abfrage 1 erhält nur die Anzahl der Juni-Monate, Abfrage 2 wird von April bis Juli gezählt, wobei die Jun-Monat-Anzahl (in Abfrage 2) nicht mit der Juni-Monat-Zählung von Abfrage 1 übereinstimmt.SQL Server - WHERE Datumsbereich & GROUP BY MonthName

Abfrage 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 

Abfrage 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 

Danke, Jay

+0

Wie unterscheiden sich die Juni-Daten in der ersten Abfrage von der zweiten? – Santi

+0

Abfrage 1 gibt zurück: Juni 2016 - 290 & Abfrage 2 gibt die Zählung 307 für Juni 2016 zurück. Bitte beraten. – Jay

+0

Brauchen Sie die Daten zu spielen und sehen, was los ist, aber um es zu beheben versuchen Sie, Ihre Where-Klausel in der ersten Abfrage zu ändern: wo DATENAME (MONAT, SubmissionDate) = 'Juni' .... sehen, ob das immer noch die gleiches Ergebnis wie zuvor. Ist auch SubmissionDate ein DateTime-Feld oder Varchar? – objectNotFound

Antwort

1

SubmissionDate müssen DATETIME Typ sein und damit Sie alle Werte für Ihren letzten Tag fehlt , 06/30/2016, da dies 06/30/2016 00:00:00 entspricht. Dies bedeutet, dass alle Datensätze, die SubmissionDate mit einer time > 00:00:00 on 6/30/2016 haben, ausgeschlossen werden. Zum Beispiel würde 6/30/2016 12:44:22 nicht in Ihren Ergebnissen mit Ihrer aktuellen Logik enthalten sein.

Verwenden Sie eine dieser statt:

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

Das erste Verfahren ist bevorzugt, da Sie alle Datensätze, bevor 2016.07.01 bekommen, was 6/30/2016 23:59:59.999 enthält. Natürlich sollten Sie sich bewusst sein, wie genau in SQL Server sein kann. Führen Sie den folgenden Code aus, um zu sehen, was ich meine.

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