Ich habe eine Frage wie diese:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Dies führt jedoch zu keinen Ergebnissen, obwohl Daten zum 1. vorliegen.
created_at
sieht aus wie 2013-05-01 22:25:19
, ich vermute es hat mit der zeit zu tun? Wie könnte dies gelöst werden?
Es funktioniert gut, wenn ich größere Datumsbereiche mache, aber es sollte (einschließlich) auch mit einem einzigen Datum funktionieren.
sql
sql-server
sql-server-2008
tsql
date
JBurace
quelle
quelle
Antworten:
Es ist inklusive. Sie vergleichen Datums- und Uhrzeitangaben mit Datumsangaben. Das zweite Datum wird als Mitternacht interpretiert, wenn der Tag beginnt .
Eine Möglichkeit, dies zu beheben, ist:
Eine andere Möglichkeit, dies zu beheben, sind explizite binäre Vergleiche
Aaron Bertrand hat einen langen Blogeintrag zu Daten ( hier ), in dem er dieses und andere Datumsfragen bespricht.
quelle
dateadd
für den nächsten Tag zu verwenden.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) geschlossen und am anderen (<
) geöffnet ist, kombiniert mit der Überprüfung eines Tages nach dem angegebenen Enddatum.where
Klausel umwandeln, da dadurch die Indizierung verloren geht. Es ist ein wirklich schlechtes Muster.Es wurde angenommen, dass die zweite Datumsreferenz in der
BETWEEN
Syntax auf magische Weise als "Ende des Tages" betrachtet wird, aber dies ist nicht wahr .dh dies wurde erwartet:
aber was wirklich passiert ist folgendes:
Welches wird das Äquivalent von:
Das Problem ist einer der Wahrnehmungen / Erwartungen an
BETWEEN
denen sie schließen sowohl den unteren Wert und die oberen Werte im Bereich, aber nicht auf magische Weise ein Datum „Anfang von“ oder „Ende“ machen.BETWEEN
sollte beim Filtern nach Datumsbereichen vermieden werden.Verwenden Sie
>= AND <
stattdessen immer dieDie Klammern sind hier optional, können jedoch bei komplexeren Abfragen wichtig sein.
quelle
Sie müssen eine dieser beiden Optionen ausführen:
between
Zustand auf:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(nicht empfohlen ... siehe letzter Absatz)between
. Beachten Sie, dass Sie dann einen Tag zum zweiten Wert hinzufügen müssen:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
Meine persönliche Präferenz ist die zweite Option. Auch Aaron Bertrand hat eine sehr klare Erklärung, warum es verwendet werden soll.
quelle
BETWEEN
für Datumsbereichsabfragen verwenden, die die Zeit enthalten. viel zu viel kann schief gehen.Verwenden Sie einfach den Zeitstempel als Datum:
quelle
'DATE' is not a recognized built-in function name.
muss stackoverflow.com/a/20973452/4233593Ich finde, dass die beste Lösung zum Vergleichen eines Datums- / Uhrzeitfelds mit einem Datumsfeld die folgende ist:
Dies entspricht einer Inklusiv-Zwischen-Anweisung, da sie sowohl das Start- und Enddatum als auch diejenigen enthält, die dazwischen liegen.
quelle
Dies funktioniert nur in 2008 und neueren Versionen von SQL Server
Wenn Sie eine ältere Version verwenden, verwenden Sie
quelle
convert(varchar, created_at, 101)
Ergebnis ist wiedd/MM/yyyy
und OPs Zeichenfolgen sindyyyy-MM-dd
, ich denke, diese Antwort wird nicht funktionieren;).Sie können die
date()
Funktion verwenden, mit der das Datum aus einer Datums- / Uhrzeitangabe extrahiert und das Ergebnis als Inklusivdatum angegeben wird:quelle
Dyamic Datum zwischen SQL-Abfrage
quelle