Det bästa sättet att ta bort tidsdelen av ett datetime-fält är att använda funktionerna datediff och dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Detta drar fördel av det faktum att SQL Server lagrar datum som två heltal, ett representerar antalet dagar sedan dag "0" - (1 jan 1900), och det andra som representerar antalet ticks (varje bock är cirka 3,33 ms) sedan midnatt (för tiden) *.
formeln ovan måste helt enkelt bara läsa det första heltal. Det krävs ingen konvertering eller bearbetning, så det är extremt snabbt.
För att få dina frågor att använda ett index... använd den här formeln på indatafiltreringsparametrarna först, eller på den "andra" sidan av likhetstecknet från fältet för tabellernas datum och tid, så att frågeoptimeraren inte behöver köra beräkningen i varje datetime-fält i tabellen för att avgöra vilka rader som uppfyller filterpredikatet. Detta gör ditt sökargument "SARG-able" (Search ARGument)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
snarare än
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* NOTERA. Internt lagrar det andra heltal (tidsdelen) bockar. På en dag finns det 24 x 60 X 60 X 300 =25 920 000 bockar (serendipitalt precis under maxvärdet som ett 32-bitars heltal kan hålla). Du behöver dock inte oroa dig för detta när du aritmetiskt ändrar en datetime... När du lägger till eller subtraherar värden från datetimes kan du behandla värdet som ett bråk som om det var exakt lika med bråkdelen av en dag, som om fullständigt datetime-värde var ett flyttal som bestod av en heltalsdel som representerar datumet och den bråkdel som representerar tiden). 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`