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.
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 –
Wenn das echte Daten sind, sollten Sie sie sofort entfernen. –
Es ist kein echtes one.yways ich gelöscht that.Thanx für die Info. :) – Telgo