it-swarm.com.de

Postgresql-Abfrage zwischen Datumsbereichen

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'

Problem dabei ist, dass ich das erste Datum und das letzte Datum vor dem Abfragen der Tabelle berechnen muss. Gibt es einen einfacheren Weg, dies zu tun?

Vielen Dank

93
John

Mit Datum (und Uhrzeit) werden viele Dinge einfacher, wenn Sie >= start AND < end.

Zum Beispiel:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

In diesem Fall müssen Sie noch das Startdatum des Monats berechnen, das Sie benötigen. Dies sollte jedoch in vielerlei Hinsicht einfach sein.

Das Enddatum wird ebenfalls vereinfacht. fügen Sie einfach genau einen Monat hinzu. Kein Durcheinander mit dem 28., 30., 31. usw.


Diese Struktur hat auch den Vorteil, dass die Verwendung von Indizes beibehalten werden kann.


Viele Leute mögen eine Form wie die folgende vorschlagen, aber sie verwenden keine Indizes:

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

Dies beinhaltet die Berechnung der Bedingungen für jede einzelne Zeile in der Tabelle (ein Scan) und nicht die Verwendung des Index, um den Bereich der Zeilen zu finden, die übereinstimmen (eine Bereichssuche).

151
MatBailie

Ab PostgreSQL 9.2 werden Range Types unterstützt. So können Sie dies wie folgt schreiben:

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

dies sollte effizienter sein als der Zeichenfolgenvergleich

Nur für den Fall, dass jemand hier landet ... seit 8.1 können Sie einfach Folgendes verwenden:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

Aus den Dokumenten:

ZWISCHEN SYMMETRISCH ist dasselbe wie ZWISCHEN, außer dass das Argument links von UND kleiner oder gleich dem Argument rechts sein muss. Ist dies nicht der Fall, werden diese beiden Argumente automatisch vertauscht, sodass immer ein nicht leerer Bereich impliziert wird.

5
HayrolR