it-swarm.com.de

So vergleichen Sie datetime mit nur Datum in SQL Server

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

62
Muhabutti

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.

  1. In den meisten Fällen wird durch die Verwendung einer Funktion für Daten zum Filtern oder Verknüpfen die Möglichkeit des Optimierers zum Zugriff auf einen Index in diesem Feld aufgehoben, wodurch die Abfrage langsamer (oder "teurer") wird.
  2. Die andere ist, dass für jede betroffene Datenzeile mindestens eine Berechnung ausgeführt wird. Dies könnte das Hinzufügen von Hunderten, Tausenden oder vielen Millionen Berechnungen zur Abfrage sein, sodass wir mit einem einzigen Kriterium wie 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)

68
Used_By_Already

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.

enter image description here

Sie sehen, dass SQL Server dies tatsächlich in eine Klausel> und <umwandelt:

 enter image description here

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'

 showing index usage with secondary index

51
Steve Ford

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 verwenden
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'.

2
imdzeeshan

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' 
0
Bikram