2014-02-22 17 views
7

Ich habe eine gespeicherte Prozedur, die alle Datensätze mit einem Datum abrufen soll, das dem aktuellen Datum oder in der Zukunft entspricht. Die Daten werden in der Spalte targetDate gespeichert und als datetime formatiert. Mein entsprechenden WHERE-Klausel ist die folgende:SQL Server: datetime Tag mit GETDATE() vergleichen

WHERE A.targetDate >= GETDATE() 

Im Allgemeinen ist meine gespeicherten Prozedur funktioniert gut, mein einziges Problem, wenn die targetDate das aktuelle Datum ist gleich wie alle Daten gespeichert werden wie folgt, dh mit der Zeit auf Null gesetzt :

2014-02-22 00:00:00.000 

Wie muss ich meine WHERE-Klausel ändern, so dass es nur das Datum ist jedoch der Ansicht ignoriert die Zeit mit ihm gespeichert, so dass ich alle Datensätze mit dem aktuellen Datum erhalten, auch wenn die Zeit bereits abgelaufen ist?

Vielen Dank für jede Hilfe mit diesem, Tim.

+0

Welche Version von SQL Server, den Sie haben? –

+0

Ich habe SQL Server Version 2008 – user2571510

Antwort

20

Schalte auf:

SELECT DATEADD(dd,0,DATEDIFF(dd,0,GETDATE())) 

Ist dies Ihre letzte Zeile sollte

WHERE A.targetDate >= cast(GETDATE() as date) 

Bearbeiten - weil targetdate enthält auch Zeit, ja, format beides wie folgt:

WHERE cast(A.targetDate as date) >= cast(GETDATE() as date) 

Bearbeiten - gegeben Kommentare Re: Leistung, Möchten Sie folgendes versuchen:

WHERE a.targetdate >= cast(cast(getdate() as date) as datetime) 

Das letzte Mal bearbeitet sollten Sie das gleiche Ergebnis und profitieren Sie von irgendwelchen Indizes auf targetdate nehmen

+0

Danke - das funktioniert nicht für mich. Muss ich das targetDate auch formatieren? – user2571510

+1

Nicht, wenn es ein Datumsfeld ist. Ist es ein Zeitstempel oder ein Datumsfeld? –

+0

Es ist ein Datetime-Feld, aber die Eingabe ist immer nur ein Datum, weshalb es die Nullen für die Zeit wie im obigen Beispiel hinzufügt. – user2571510

2

Folgendes sollte man das aktuelle Datum ohne Zeit geben:

WHERE A.targetDate >= DATEADD(dd,0, ATEDIFF(dd,0,GETDATE())) 
+1

Die Verwendung der zweiten 'SELECT' ist ein Syntaxfehler. Sie brauchen die Unterabfrage nicht, also entfernen Sie einfach die SELECT-Taste. Und ändern Sie 'ATEDIFF' für' DATEDIFF';) – MatBailie

+0

Danke. Das war ein Copy/Paste-Fehler von der obigen Zeile; Ich habe es repariert. – Preli

Verwandte Themen