Select * from [User] U
where U.DateCreated = '2014-02-07'
aber in der Datenbank wurde der Benutzer erstellt 2014-02-07 12:30:47.220
und als ich nur legte'2014-02-07'
Es werden keine Daten angezeigt
Antworten:
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: Was bedeutet das Wort "SARGable" wirklich?
BEARBEITEN + 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
. Es ist weitaus effizienter, die Kriterien an die Daten anzupassen."Ändern der Kriterien an die Daten" ist meine Art, " SARGABLE
Prädikate verwenden" zu beschreiben.
Und nicht zwischen verwenden.
Die beste Vorgehensweise bei Datums- und Zeitbereichen besteht darin, ZWISCHEN zu vermeiden und immer das folgende Formular zu verwenden:
WHERE col> = '20120101' AND col <'20120201' Dieses Formular funktioniert mit allen Typen und Präzisionen, unabhängig davon, ob der Zeitteil anwendbar ist.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)
can
manchmal kompensieren.
date literal
Format ist "JJJJMMTT". Datentypen: Datum oder Datum / Uhrzeit oder Uhrzeit oder Datum / Uhrzeit2 oder kleine Datenzeit haben KEIN Format, da sie als Zahlen gespeichert sind. Für Datumsliterale ist 'JJJJ-MM-TT' NICHT ganz sicher. Es gibt eine Gebietsschemaeinstellung, die diese Sequenz als JJJJ-TT-MM falsch interpretieren kann
Wenn Sie mit SQL Server 2008 oder höher arbeiten, können Sie den Datumsdatentyp verwenden:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
Es ist zu beachten, dass bei einer Indizierung der Datumsspalte der Index weiterhin verwendet wird und SARGable ist. Dies ist ein Sonderfall für Datums- und Uhrzeitangaben.
Sie können sehen, dass SQL Server dies tatsächlich in eine> und <-Klausel umwandelt:
Ich habe dies gerade an einer großen Tabelle versucht, mit einem Sekundärindex in der Datumsspalte gemäß den Kommentaren von @ kobik, und der Index wird weiterhin verwendet. Dies ist bei den Beispielen, die ZWISCHEN oder> = und <: verwenden, nicht der Fall.
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
AaronsBad
Datenbank heutzutage?
Nach Ihrer Anfrage
Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server vergleicht genaues Datum und die Zeit , dh ( im Vergleich 2014-02-07 12:30:47.220
mit 2014-02-07 00:00:00.000
der Gleichheit). Deshalb ist das Vergleichsergebnis falsch
Daher müssen Sie beim Vergleichen von Daten auch die Zeit berücksichtigen. Sie können verwenden
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
.
between
mit Gleichheit an beiden Enden (> = und <=), z. B. select * from x where col_1 between 'A' and 'M'
enthält A und M (plus B bis L natürlich). Diese inklusive Natur von between
ist großartig für so etwas wie einen Dokumentenindex; Für Datums- / Zeitbereiche ist dies jedoch eine Katastrophe, da es zu Überlappungen kommt. Ich weiß, dass die Verwendung von zwischen gut aussieht, aber in Wahrheit SQL between
funktioniert ein einfach nicht richtig für Datumsbereiche. Verwenden Sie immer eine Kombination von> = mit <wie inU.DateCreated >='2014-02-07' and U.DateCreated < '2014-02-08'
between
ist OK. Ihr Vorschlag zu verwenden >=
und <
ist zweifellos between
für Datumsbereiche vorzuziehen . Ich möchte nur sagen, dass wir die Zeit auch beim Vergleichen von Daten berücksichtigen sollten.
Bitte versuchen Sie dies. Diese Abfrage kann zum Datumsvergleich verwendet werden
select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Sie können LIKE
anstelle von Anweisung verwenden =
. Aber um dies mit DateStamp zu tun, müssen Sie CONVERT
es zuerst zu VARCHAR:
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'