In SQL Server habe ich eine Spalte "DATETIME", die ein Zeitelement enthält.
Beispiel:
'14 AUG 2008 14:23:019'
Was ist die beste Methode, um nur die Datensätze für einen bestimmten Tag auszuwählen, ohne den Zeitteil zu berücksichtigen?
Beispiel: (Nicht sicher, da es den Zeitteil nicht berücksichtigt und keine Zeilen zurückgibt)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
*Anmerkung: Da es auf dieser Seite auch darum geht, Notizen und Techniken aufzuschreiben, die man aufgeschnappt und dann vergessen hat, werde ich meine eigene Antwort auf diese Frage posten, da DATETIME-Zeug in MSSQL wahrscheinlich das Thema ist, das ich in SQLBOL am häufigsten nachschlage.
Update Das Beispiel wurde präzisiert.
Edit Entschuldigung, aber ich musste FALSCHE Antworten (Antworten, die falsche Ergebnisse liefern) heruntermodifizieren.
@Jorrit: WHERE (date>'20080813' AND date<'20080815')
wird den 13. und den 14. zurückgeben.
@wearejimbo: Close, but no cigar! Abzeichen an dich vergeben. Du hast Aufzeichnungen übersehen, die am 14/08/2008 23:59:001 bis 23:59:999 (d.h. weniger als 1 Sekunde vor Mitternacht) geschrieben wurden.
Technik 1:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)
Der Vorteil dieser Methode ist, dass sie jeden Index auf 'column_datetime' verwendet, wenn er existiert.
Technik 2:
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
Wenn das Feld column_datetime nicht indiziert ist und es auch nicht sein wird (oder der Index wahrscheinlich nicht verwendet wird), ist die Verwendung von DATEDIFF() kürzer.
SELECT *
FROM table1
WHERE CONVERT(varchar(10),columnDatetime,121) =
CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
Dies konvertiert die Datenzeit und die Zeichenkette in varchars des Formats "JJJJ-MM-TT".
Das ist sehr hässlich, sollte aber funktionieren