Den bedste måde at fjerne tidsdelen af et datetime-felt på er at bruge funktionerne datediff og dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Dette drager fordel af det faktum, at SQL Server gemmer datoer som to heltal, det ene repræsenterer antallet af dage siden dag "0" - (1. jan 1900), og det andet repræsenterer antallet af flueben (hvert kryds er omkring 3,33 ms) siden midnat (for tiden) *.
formlen ovenfor skal simpelthen kun læse det første heltal. Der kræves ingen konvertering eller behandling, så det er ekstremt hurtigt.
For at få dine forespørgsler til at bruge et indeks... brug først denne formel på inputfiltreringsparametrene eller på den "anden" side af lighedstegnet fra feltet for tabellernes dato og klokkeslæt, så forespørgselsoptimeringsværktøjet ikke skal køre beregningen på hvert datetime-felt i tabellen for at bestemme, hvilke rækker der opfylder filterprædikatet. Dette gør dit søgeargument "SARG-able" (Søgeargument)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
snarere end
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* BEMÆRK. Internt gemmer det andet heltal (tidsdelen) flueben. På en dag er der 24 x 60 X 60 X 300 =25.920.000 flueben (serendipitalt lige under den maksimale værdi, et 32 bit heltal kan indeholde). Du behøver dog ikke bekymre dig om dette, når du aritmetisk ændrer et dato-klokkeslæt... Når du tilføjer eller trækker værdier fra datetimes, kan du behandle værdien som en brøk, som om den var nøjagtigt lig med brøkdelen af en dag, som om komplet datetime-værdi var et flydende decimaltal bestående af en heltalsdel, der repræsenterer datoen, og den brøkdel, der repræsenterer klokkeslættet). dvs.
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`