sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan sammenlignes datetime med kun dato i SQL Server

Bliv IKKE fristet til at gøre ting som dette:

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

Dette er en bedre måde:

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

se:Hvad betyder ordet "SARGable" egentlig?

EDIT +Der er 2 grundlæggende grunde til at undgå brug af funktioner på data i where-klausulen (eller i joinbetingelser).

  1. I de fleste tilfælde fjerner brugen af ​​en funktion på data til at filtrere eller joine optimeringsværktøjets mulighed for at få adgang til et indeks på det felt, hvilket gør forespørgslen langsommere (eller mere "dyr")
  2. Den anden er, at for hver række af data, der er involveret, udføres der mindst én beregning. Det kunne være at tilføje hundreder, tusinder eller mange millioner af beregninger til forespørgslen, så vi kan sammenligne med et enkelt kriterium som 2014-02-07 . Det er langt mere effektivt at ændre kriterierne, så de passer til dataene i stedet.

"At ændre kriterierne, så de passer til dataene" er min måde at beskrive "brug SARGABLE prædikater"

Og brug heller ikke mellem.

den bedste praksis med dato- og tidsintervaller er at undgå MELLEM og for altid at bruge formularen:

WHERE col>='20120101' OG col <'20120201' Denne formular fungerer med alle typer og alle præcisioner, uanset om tidsdelen er anvendelig.

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



  1. Hvorfor har vi brug for meddelelsesmæglere som RabbitMQ over en database som PostgreSQL?

  2. To PLSQL-sætninger med start og slut, kører fint hver for sig, men ikke sammen?

  3. Oracle Sequence nextval hopper nummer frem og tilbage

  4. Konverter et månedsnummer til månedsnavnet i SQL Server (T-SQL)