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
quelle
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
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 kannWenn 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:
SELECT * FROM [User] U WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
quelle
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
mit2014-02-07 00:00:00.000
der Gleichheit). Deshalb ist das Vergleichsergebnis falschDaher 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'
.quelle
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 vonbetween
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 WahrheitSQL 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 zweifellosbetween
für Datumsbereiche vorzuziehen . Ich möchte nur sagen, dass wir die Zeit auch beim Vergleichen von Daten berücksichtigen sollten.Natürlich ist dies ein alter Thread, aber um ihn zu vervollständigen.
Ab SQL 2008 können Sie den Datentyp DATE verwenden, um Folgendes zu tun:
SELECT CONVERT(DATE,GETDATE()) OR Select * from [User] U where CONVERT(DATE,U.DateCreated) = '2014-02-07'
quelle
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'
quelle
Sie können
LIKE
anstelle von Anweisung verwenden=
. Aber um dies mit DateStamp zu tun, müssen SieCONVERT
es zuerst zu VARCHAR:SELECT * FROM [User] U WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'
quelle