PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich einen ganzen Tag mit einem datetime-Feld abgleichen?

Übertragen Sie Ihren timestamp Wert bis date wenn Sie eine einfache Syntax wünschen. So:

SELECT *
FROM   tbl
WHERE  timestamp_col::date = '2011-12-01';  -- date literal

Bei großen Tabellen geht dies jedoch schneller:

SELECT *
FROM   tbl
WHERE  timestamp_col >= '2011-12-01 0:0'    -- timestamp literal
AND    timestamp_col <  '2011-12-02 0:0';

Grund:Die zweite Abfrage muss nicht jeden einzelnen Wert in der Tabelle transformieren und kann einen einfachen Index für die Timestamp-Spalte verwenden. Der Ausdruck ist sargable.

Beachten Sie, dass die Obergrenze ausgeschlossen ist (< statt <= ) für eine korrekte Auswahl.
Sie können dies ausgleichen, indem Sie einen Index für einen Ausdruck wie diesen erstellen:

CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date));

Dann wird die erste Version der Abfrage so schnell wie möglich sein.