Ich versuche, meine postgresql-Datenbank abzufragen, um Ergebnisse zurückzugeben, bei denen ein Datum in einem bestimmten Monat und Jahr liegt. Mit anderen Worten, ich möchte alle Werte für ein Monat-Jahr.
Der einzige Weg, wie ich es bisher geschafft habe, ist folgender:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
Das Problem dabei ist, dass ich das erste und das letzte Datum berechnen muss, bevor ich die Tabelle abfrage. Gibt es einen einfacheren Weg, dies zu tun?
Vielen Dank
sql
postgresql
date
between
John
quelle
quelle
Antworten:
Mit Datum (und Uhrzeit) werden viele Dinge einfacher, wenn Sie verwenden
>= start AND < end
.Beispielsweise:
In diesem Fall müssen Sie noch das Startdatum des gewünschten Monats berechnen, dies sollte jedoch in vielerlei Hinsicht einfach sein.
Das Enddatum wird ebenfalls vereinfacht. füge einfach genau einen Monat hinzu. Kein Herumspielen mit dem 28., 30., 31. usw.
Diese Struktur hat auch den Vorteil, dass die Verwendung von Indizes beibehalten werden kann.
Viele Leute schlagen möglicherweise ein Formular wie das folgende vor, verwenden jedoch keine Indizes:
Dies beinhaltet die Berechnung der Bedingungen für jede einzelne Zeile in der Tabelle (ein Scan) und nicht die Verwendung des Index, um den übereinstimmenden Zeilenbereich zu finden (eine Bereichssuche).
quelle
2014-12-01
&2015-01-01
. Der zweite kann ebenfalls indiziert werden, aber das ist nicht trivial, ich gebe zu -EXTRACT()
scheint kompatibler zu sein.Von PostreSQL 9.2 Bereichstypen werden unterstützt. Sie können dies also wie folgt schreiben:
Dies sollte effizienter sein als der Zeichenfolgenvergleich
quelle
Nur für den Fall, dass jemand hier landet ... seit 8.1 können Sie einfach verwenden:
Aus den Dokumenten:
quelle
Das Schlüsselwort Between funktioniert ausnahmsweise für ein Datum. Es wird davon ausgegangen, dass die Uhrzeit für Daten um 00:00:00 Uhr (dh Mitternacht) liegt.
quelle
Lesen Sie die Dokumentation.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
Ich habe eine solche Abfrage verwendet:
oder
Juanitos Ingenier.
quelle