PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment faire correspondre une journée entière à un champ datetime ?

Diffusez votre timestamp valeur à date si vous voulez une syntaxe simple. Comme ceci :

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

Cependant, avec de grandes tables, ce sera plus rapide :

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

Raison :la deuxième requête n'a pas à transformer chaque valeur de la table et peut utiliser un simple index sur la colonne d'horodatage. L'expression est sargable.

Remarque exclu la limite supérieure (< au lieu de <= ) pour une sélection correcte.
Vous pouvez compenser cela en créant un index sur une expression comme celle-ci :

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

Ensuite, la première version de la requête sera aussi rapide que possible.