Lassen Sie sich nicht dazu verleiten, solche Dinge zu tun:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Dies ist ein besserer Weg:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
siehe:Was bedeutet das Wort „SARGable“ wirklich?
BEARBEITEN + Es gibt zwei grundlegende Gründe dafür, die Verwendung von Funktionen für Daten in der Where-Klausel (oder in Join-Bedingungen) zu vermeiden.
- In den meisten Fällen entfernt die Verwendung einer Funktion für Daten zum Filtern oder Verbinden die Fähigkeit des Optimierers, auf einen Index für dieses Feld zuzugreifen, wodurch die Abfrage langsamer (oder "kostspieliger") wird
- Die andere ist, dass für jede betroffene Datenzeile mindestens eine Berechnung durchgeführt wird. Das könnte das Hinzufügen von Hunderten, Tausenden oder vielen Millionen von Berechnungen zur Abfrage sein, damit wir sie mit einem einzelnen Kriterium wie
2014-02-07
vergleichen können . Es ist viel effizienter, stattdessen die Kriterien an die Daten anzupassen.
"Ändern der Kriterien, um sie an die Daten anzupassen" ist meine Art zu beschreiben "benutze SARGABLE
Prädikate"
Und nicht dazwischen verwenden.
Die beste Vorgehensweise bei Datums- und Zeitbereichen ist es, BETWEEN zu vermeiden und immer das Formular zu verwenden:
WHERE col>='20120101' AND col <'20120201' Dieses Formular funktioniert mit allen Typen und allen Genauigkeiten, unabhängig davon, ob der Zeitteil anwendbar ist.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)