sql >> Databáze >  >> RDS >> Sqlserver

Převeďte pole data a času serveru SQL pro porovnání pouze částí data s indexovaným vyhledáváním

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`


  1. Arval SQLException:FATAL:Omlouváme se, příliš mnoho klientů je již v postgresu

  2. Naučte se používat několik funkcí MySQL a MariaDB – část 2

  3. SQL MIN() pro začátečníky

  4. Mysql - druhý auto_increment col s chováním rozdílu