So vergleichen Sie datetime mit nur date in SQL server

Select * from [User] U where U.DateCreated = '2014-02-07' 

aber in der database wurde der Benutzer auf 2014-02-07 12:30:47.220 und als ich nur '2014-02-07'

Es werden keine data angezeigt

Sei nicht versucht, so etwas zu tun:

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

Das ist ein besserer path:

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

siehe: Sargable

EDIT + Es gibt zwei grundsätzliche Gründe für die Vermeidung der Nutzung von functionen auf data in der where-Klausel (oder in Join-Bedingungen).

  1. In den meisten Fällen, die eine function auf data zum Filtern oder Verbinden verwenden, entfernt die Fähigkeit des Optimierers, auf einen Index auf diesem Feld zuzugreifen, wodurch die Abfrage langsamer (oder mehr "kostspielig")
  2. Die andere ist, für jede Zeile von data beteiligt ist mindestens eine Berechnung durchgeführt wird. Das könnte Hunderte, Tausende oder viele Millionen Berechnungen der Abfrage hinzufügen, damit wir mit einem einzigen Kriterium wie 2014-02-07 . Es ist viel effizienter, die Kriterien an die data anzupassen.

"Die Anpassung der Kriterien an die data" ist meine Art zu beschreiben "verwenden SARGABLE Prädikate"


Und benutze nicht zwischen beiden.

die bewährte Praxis mit dates- und timebereich ist es, ZWISCHEN zu vermeiden und immer das Formular zu verwenden:

WHERE col> = '20120101' AND col <'20120201' Dieses Formular funktioniert mit allen Typen und allen Präzisionen, unabhängig davon, ob der timeteil anwendbar ist.

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

Wenn Sie auf SQL server 2008 oder höher sind, können Sie den datatyp datatyp verwenden:

 SELECT * FROM [User] U WHERE CAST(U.DateCreated as DATE) = '2014-02-07' 

Es sollte beachtet werden, dass, wenn date Spalte indiziert wird, dann wird noch der Index verwenden und ist SARGable. Dies ist ein Sonderfall für Termine und datesangaben.

Bildbeschreibung hier eingeben

Sie können sehen, dass SQL server tatsächlich in eine> und <Klausel:

Bildbeschreibung hier eingeben

Ich habe es gerade auf einem großen Tisch ausprobiert, mit einem sekundären Index auf der datessäule nach @ kobik's Kommentare und der Index wird immer noch verwendet, dies ist nicht der Fall für die Beispiele, die BETWEEN oder> = und <verwenden:

 SELECT * FROM [User] U WHERE CAST(U.DateCreated as DATE) = '2016-07-05' 

Zeigen der Indexnutzung mit sekundärem Index

Nach deiner Abfrage Select * from [User] U where U.DateCreated = '2014-02-07'

SQL server vergleicht exaktes date und Uhrzeit, dh (Vergleich von 2014-02-07 12:30:47.220 mit 2014-02-07 00:00:00.000 für Gleichheit). Darum ist das Ergebnis des Vergleichs falsch

Deshalb, während Sie data vergleichen, müssen Sie auch time berücksichtigen. Sie können verwenden
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08' .

Bitte versuchen Sie dies. Diese Abfrage kann für den datesvergleich verwendet werden

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

Sie können die LIKE statement anstelle von = . Aber um dies mit DateStamp zu tun, musst du es zuerst auf VARCHAR CONVERT :

 SELECT * FROM [User] U WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'