SQL Server: vergelijk datetime dag met GETDATE()

Ik heb een opgeslagen procedure die dient op te halen alle records met een datum die gelijk is aan de huidige datum of in de toekomst.
De data worden opgeslagen in de kolom targetDate en opgemaakt als datetime.
Mijn overeenkomstige WHERE-component is de volgende:

WHERE A.targetDate >= GETDATE()

In het algemeen mijn opgeslagen procedure werkt prima, alleen mijn probleem is dat als de targetDate is gelijk aan de huidige datum als alle data zijn opgeslagen als volgt te werk, dat wil zeggen met de tijd ingesteld op nul:

2014-02-22 00:00:00.000

Hoe moet ik mijn WHERE-component, zodat het alleen rekening met de datum, maar negeert de tijd opgeslagen met het zo dat ik alle records met de huidige datum als de tijd al verstreken ?

Veel dank voor alle hulp met deze, Tim.

  • Welke versie van sql server die u hebt?
  • Ik heb de versie van SQL Server 2008

 

2 Replies
  1. 22

    Wijziging:

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

    Bewerken – omdat targetdate ook de tijd, ja, zowel als deze:

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

    Bewerken – gegeven opmerkingen re: prestaties, kan het toch wilt proberen:

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

    Laatste edit geeft u hetzelfde resultaat en het maken van de indexen op targetdate

    • Bedankt – dit werkt niet voor mij. Moet ik voor de opmaak van de targetDate zo goed ?
    • Niet als het een datum-veld. Is het een timestamp of een datum-veld?
    • Het is een datetime-veld, maar de ingang altijd alleen een datum die is de reden waarom het voegt de nullen voor de tijd, zoals in het voorbeeld hierboven.
    • Probeer het gieten dat als datum ook. (zie edit)
    • Dat werkt perfect bedankt !
    • Er is geen noodzaak tot het uitbrengen van targetDate te date.
    • Het verpakken van een veld in een CAST() maakt het niet-SARGable. In andere woorden, het doodt de mogelijkheid om gebruik te maken van een index en zorgt voor een volledige tabel-scan. In dit geval, als het gebied is al een datum-tijd-gegevenstype, is er Geen noodzaak voor het (niet nodig voor het verwijderen van de tijd onderdeel bij het vergelijken van >= a_date).
    • Als targetdate bevat 2/22 om 5 uur is en hij wil een huidige datetime van 2/22 om 6 uur terug te komen en dat zou een probleem zijn. Vanwege de onmogelijkheid tot gebruik van een index hoewel ik het eens hij moet waarschijnlijk als een alternatief gebruik: WAAR een.targetdate >= cast(gegoten(getdate() als date) as datetime)

  2. 2

    Het volgende moet geven u de huidige datum-tijd:

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

    Dit moet de laatste regel:

    WHERE A.targetDate >= DATEADD(dd,0, ATEDIFF(dd,0,GETDATE()))
    • Het gebruik van de tweede SELECT is een syntaxisfout. Er is geen noodzaak voor de subquery dus gewoon verwijderen van de SELECT. En veranderen ATEDIFF voor DATEDIFF 😉
    • Dank u. Dat was een copy/paste fout van de regel erboven; I fixed it.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *