2017-03-22 1 views
0

Ich habe einen Tisch Accountmaster. Wenn ein Datum angegeben wird, sollte die Anzahl der registrierten Kunden (DOE) in den letzten drei Jahren des angegebenen Datums zurückgegeben werden.SQL Server: die letzten drei Jahre finden Kundendaten

hier ist meine Frage, die nicht zurückkehrt values.plz mir zu helfen, mit Änderungen .TIA

select count(ACID) as numberofcustomers from ACCOUNTMASTER 
where 
datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10')) 
and 
doe<= datepart(yy,'2012/04/10') 
+1

Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 und die akzeptierte Antwort –

+0

Wenn das echte Daten sind, sollten Sie sie sofort entfernen. –

+0

Es ist kein echtes one.yways ich gelöscht that.Thanx für die Info. :) – Telgo

Antwort

0

Ihr Problem ist ein scheinbares Missverständnis auf welcher DATEPART tut, und wie Daten zu vergleichen. Lassen Sie uns also Ihre WHERE-Klausel aufschlüsseln.

where 
    datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10')) 

Diese Klausel vergleicht den Wert des Jahres nach dem Datum in der Spalte doe mit dem Jahr eines Datums zwei Jahre vor einem festen Termin, die die vom Benutzer eingegebenen Datum. So gibt datepart(yy, dateadd(yy, -2,'2012/04/10')) einen Wert von 2010 als int zurück. Dies wird mit der verglichen, die das ganzzahlige Jahr des in der Spalte doe gespeicherten Datumswertes zurückgibt. Da diese beiden Datentypen beide int, sind, macht der Vergleich, was er sollte, und gibt Informationen aus Aufzeichnungen vom 01.01.2010 und später zurück. Keine Probleme hier - es sei denn, Sie erwarten, Daten von 2010/04/10 weiterleiten, in diesem Fall möchten Sie den Wert dateadd(yy, -2,'2012/04/10') mit dem Wert in der Spalte doe vergleichen.

and doe<= datepart(yy,'2012/04/10') 

In diesem Fall gibt es ein Vergleichsproblem. Sie versuchen, den ganzzahligen Wert 2012 mit dem Datumswert in der Spalte doe zu vergleichen. Da diese nicht den gleichen Datentyp haben, müssen wir herausfinden, was verglichen wird.

Ich nehme an, dass die doe Spalte ist ein Datetime-Datentyp (wenn es ein Datum oder Datetime2 wäre, würden Sie einen Fehler erhalten.) Eine Ganzzahl kann mit einem Datetime verglichen werden, da SQL Server einen numerischen Datentyp verwendet der Datetime-Datentyp Ein Wert von 2012 steht für das Datum 1905.07.06 (verwenden CAST(2012 as datetime) für sich selbst zu sehen), so übersetzt die WHERE-Klausel wie etwas aus:

WHERE datepart(year, doe) >= 2010 
    AND doe < '1905/07/06' 

Da ein Datum nicht beide vor Juli sein, 1905 und am oder nach dem Jan. 2010 werden keine Daten zurückgegeben.

Was hier wirklich benötigt wird, hängt davon ab, ob Sie nur Jahre vergleichen wollen oder nicht, oder Sie möchten Jahr/Monat/Tag vergleichen. Nur für Jahre können Sie die letzte doe durch DATEPART(year, doe) ersetzen und eine funktionale Abfrage haben, wenn auch keine schnelle. Um Jahr/Monat/Tag zu vergleichen, verwenden Sie die DATEADD wie oben erwähnt, und verwenden Sie nur das tatsächlich eingegebene Datum im endgültigen Vergleich.

Hoffentlich hilft das.

+0

Thx für die Korrektur. Ich habe Datepart nach AND vermisst. Es funktioniert jetzt. Thq :) – Telgo

Verwandte Themen