Nejlepším způsobem, jak odstranit časovou část pole datetime, je použití funkcí datediff a dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
To využívá skutečnost, že SQL Server ukládá data jako dvě celá čísla, z nichž jedno představuje počet dní ode dne "0" - (1. leden 1900) a druhé představuje počet tiků (každý tik je asi 3,33 ms) od půlnoci (pro daný čas) *.
výše uvedený vzorec prostě musí číst pouze první celé číslo. Není potřeba žádná konverze ani zpracování, takže je extrémně rychlý.
Chcete-li, aby vaše dotazy používaly index... použijte nejprve tento vzorec na vstupních filtrovacích parametrech nebo na "druhé" straně rovnítka z pole data a času tabulky, aby optimalizátor dotazů nemusel spouštět výpočet na každé pole datetime v tabulce, abyste zjistili, které řádky splňují predikát filtru. Díky tomu bude váš argument hledání „schopný SARG“ (ARGument hledání)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
spíše než
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* POZNÁMKA. Interně druhé celé číslo (časová část) ukládá ticks. Za den je 24 x 60 x 60 x 300 =25 920 000 tiků (náhodně těsně pod maximální hodnotou, kterou může pojmout 32bitové celé číslo). Při aritmetické úpravě data a času se toho však nemusíte obávat... Při sčítání nebo odečítání hodnot od dat a času můžete s hodnotou zacházet jako se zlomkem, jako by se přesně rovnala zlomkové části dne, jako by úplná hodnota data a času bylo číslo s plovoucí desetinnou čárkou skládající se z celé části představující datum a zlomkové části představující čas). tj.
`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`