Select * from [User] U
where U.DateCreated = '2014-02-07'
aber in der Datenbank wurde der Benutzer auf 2014-02-07 12:30:47.220
erstellt und wenn ich nur '2014-02-07'
Es werden keine Daten angezeigt
Seien Sie nicht versucht, 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: Sargable (die Seite wurde aus Wikipedia entfernt)
EDIT + Es gibt zwei grundlegende Gründe, um die Verwendung von Funktionen für Daten in der where-Klausel (oder in Join-Bedingungen) zu vermeiden.
2014-02-07
vergleichen können. Es ist viel effizienter, die Kriterien stattdessen an die Daten anzupassen. "Die Kriterien an die Daten anpassen" ist meine Art, "useSARGABLE
Prädikate" zu beschreiben.
Und nicht zwischen verwenden.
die beste Vorgehensweise bei Datums- und Zeitbereichen ist es, ZWISCHEN und bis .__ zu vermeiden. Verwenden Sie immer das Formular:
WHERE col> = '20120101' AND col <'20120201' Dieses Formular funktioniert mit allen Typen und alle Genauigkeiten, unabhängig davon, ob der Zeitteil .__ ist. anwendbar.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)
Wenn Sie sich in SQL Server 2008 oder höher befinden, können Sie den Datumsdatentyp verwenden:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
Es sollte beachtet werden, dass, wenn die Datumsspalte indiziert ist, der Index weiterhin verwendet wird und SARGable ist. Dies ist ein Sonderfall für Datums- und Datumsangaben.
Sie sehen, dass SQL Server dies tatsächlich in eine Klausel> und <umwandelt:
Ich habe es gerade an einer großen Tabelle ausprobiert, mit einem sekundären Index für die Datumsspalte, wie in den Kommentaren von @ kobik und der Index wird immer noch verwendet. Dies ist jedoch nicht der Fall bei den Beispielen, die mit BETWEEN oder> = und <arbeiten:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
Entsprechend Ihrer Suchanfrage Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server vergleicht genaues Datum und Uhrzeit, d. H. (Vergleich von 2014-02-07 12:30:47.220
mit 2014-02-07 00:00:00.000
für Gleichheit). Deshalb ist das Ergebnis des Vergleichs falsch
Deshalb müssen Sie beim Vergleichen von Datumsangaben auch die Zeit berücksichtigen. Sie können verwendenSelect * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
.
Natürlich ist dies ein alter Thread, aber um es komplett zu machen.
Ab SQL 2008 können Sie den DATE-Datentyp verwenden, sodass Sie einfach Folgendes tun können:
SELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'