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

Jak porovnat datum a čas pouze s datem na serveru SQL Server

Nenechte se v pokušení dělat takové věci:

Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'

Toto je lepší způsob:

Select * from [User] U 
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')

viz:Co skutečně znamená slovo „SARGable“?

EDIT +Existují 2 základní důvody, proč se vyhnout použití funkcí na datech v klauzuli where (nebo v podmínkách spojení).

  1. Ve většině případů použití funkce na datech k filtrování nebo spojení odebere možnost optimalizátoru získat přístup k indexu v tomto poli, čímž se dotaz zpomalí (nebo je "nákladnější")
  2. Druhou možností je, že pro každý řádek příslušných dat se provádí alespoň jeden výpočet. To by mohlo znamenat přidání stovek, tisíců nebo mnoha milionů výpočtů do dotazu, abychom mohli porovnat s jediným kritériem, jako je 2014-02-07 . Je mnohem efektivnější změnit kritéria tak, aby vyhovovala datům.

"Úprava kritérií tak, aby vyhovovala údajům" je můj způsob, jak popsat "použijte SARGABLE predikáty"

A nepoužívejte mezi oběma.

nejlepším postupem s rozsahem data a času je vyhnout se BETWEEN a vždy používat formulář:

WHERE col>='20120101' AND col <'20120201' Tento formulář pracuje se všemi typy a přesností, bez ohledu na to, zda je časová část použitelná.

http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)



  1. Najděte překrývající se období v PostgreSQL

  2. Přemostění RDBMS a NoSQL:Úvod do 2DX UI clusteru

  3. Blockchain:Co to je, jak to funguje a co to znamená pro velká data

  4. Top 50 otázek k rozhovoru pro MySQL, které si musíte připravit v roce 2022