Zum Beispiel kann
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
Wählen Sie 5 und 10 oder sind sie aus dem Bereich ausgeschlossen?
quelle
Zum Beispiel kann
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
Wählen Sie 5 und 10 oder sind sie aus dem Bereich ausgeschlossen?
Der ZWISCHEN Betreiber ist inklusive.
Aus Online-Büchern:
BETWEEN gibt TRUE zurück, wenn der Wert von test_expression größer oder gleich dem Wert von begin_expression und kleiner oder gleich dem Wert von end_expression ist.
DateTime-Einschränkung
NB: Bei DateTimes müssen Sie vorsichtig sein. Wenn nur ein Datum angegeben ist, wird der Wert ab Mitternacht an diesem Tag angenommen. Um zu vermeiden, dass Zeiten innerhalb Ihres Enddatums fehlen oder die Erfassung der Daten des folgenden Tages um Mitternacht in mehreren Bereichen wiederholt wird, sollte Ihr Enddatum 3 Millisekunden vor Mitternacht des Tages liegen, der auf Ihr bisheriges Datum folgt. 3 Millisekunden, da weniger als dieser Wert und der Wert am nächsten Tag auf Mitternacht aufgerundet werden.
Um beispielsweise alle Werte innerhalb von Juni 2016 zu erhalten, müssen Sie Folgendes ausführen:
where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')
dh
where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'
Wenn Sie 3 ms von einem Datum abziehen, sind Sie anfällig für fehlende Zeilen im 3 ms-Fenster. Die richtige Lösung ist auch die einfachste:
where myDateTime >= '20160601' AND myDateTime < '20160701'
CONVERT
einem Datetime zu einem Zeitpunkt , als die Indizes unbrauchbar machen wird. Verwenden Sie den StandardWHERE OrderDate >= '20160601' AND OrderDate < '20160701'
. Stellen Sie außerdem sicher, dass Sie verwendenyyyymmdd
, da dies vomyyyy-mm-dd
Gebietsschema abhängig ist und abhängig von denmdy, dmy, ymd, ydm, myd, and dym
Einstellungen Ihres Servers falsch interpretiert wird .Ja, aber seien Sie vorsichtig, wenn Sie zwischen Daten verwenden.
wird wirklich als 12 Uhr interpretiert, oder
Ich werde also alles verpassen, was am Tag des 31. Januar passiert ist. In diesem Fall müssen Sie Folgendes verwenden:
oder
UPDATE : Es ist durchaus möglich, dass Datensätze innerhalb der letzten Sekunde des Tages erstellt werden, mit einer Datums- und Uhrzeitangabe bis
20090101 23:59:59.997
!!Aus diesem Grund wird der
BETWEEN (firstday) AND (lastday 23:59:59)
Ansatz nicht empfohlen.Verwenden Sie
myDate >= (firstday) AND myDate < (Lastday+1)
stattdessen den Ansatz.Guter Artikel zu diesem Thema hier .
quelle
WHERE col BETWEEN 'a' AND 'z'
die meisten z-Zeilen aus.BETWEEN 5 AND 10
nicht enthalten10.2
...CAST
ing derdatetime
als einDATE
funktionieren würde:CAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
.It is entirely possible to have records created within that last second of the day, with a datetime as late as 01/01/2009 23:59:59.997
<- Könnten Sie nicht gerade dann verwendenAND '01/31/2009 23:59:59.99999999'
oder wie viele Neuner erforderlich sindBeispiel aus der realen Welt von SQL Server 2008.
Quelldaten:
Abfrage:
Ergebnisse:
quelle
ID = 3
ausgeschlossen? SeinStart
Wert entspricht dem Wert derBETWEEN
oberen Grenze undBETWEEN
ist ein inklusiver Bereich, kein exklusiver oberer Bereich.Wenn Sie dies treffen und nicht wirklich versuchen möchten, einen Tag im Code hinzuzufügen, lassen Sie die DB dies tun.
Wenn Sie den Zeitanteil angeben: Stellen Sie sicher, dass er auf Mitternacht verweist. Ansonsten können Sie einfach die Zeit weglassen:
und mach dir keine Sorgen.
quelle
quelle
Wenn der Spaltendatentyp datetime ist, können Sie dies wie folgt tun, um die Zeit von datetime zu entfernen und nur zwischen Datumsbereichen zu vergleichen.
quelle
Es enthält Grenzen.
quelle
Ich habe das immer benutzt:
WO myDate ZWISCHEN startDate UND (endDate + 1)
quelle