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

PostgreSQL :sélection de lignes qui se produisent un certain jour de la semaine, dans un fuseau horaire spécifique

AT TIME ZONE lorsqu'il est appliqué à un timestamp without timezone produit un timestamp with timezone (et dans l'autre sens). Et cet timestamp with timezone est interprété dans le fuseau horaire de votre session (qui dans votre cas est forcé à UTC ).

Donc l'expression EXTRACT (dow from time at time zone 'Brisbane/Australia') n'extrait pas le jour à Brisbane à time (UTC) , il extrait le jour correspondant à l'time convertie du point de vue de quelqu'un vivant virtuellement dans le fuseau horaire UTC.

Par exemple, lorsque je tape ceci, si je fais semblant d'être en UTC :

=> set timezone to 'UTC';
=> select now(),now() at time zone 'Australia/Brisbane';
             now              |         timezone          
------------------------------+---------------------------
 2013-10-27 18:01:03.15286+00 | 2013-10-28 04:01:03.15286

Bien, c'est dimanche 18h01 en UTC et lundi 04h01 à Brisbane

Mais si vous appliquez le déplacement du fuseau horaire à un timestamp without timezone :

select now(),now()::timestamp at time zone 'Australia/Brisbane';
              now              |           timezone            
-------------------------------+-------------------------------
 2013-10-27 18:01:57.878541+00 | 2013-10-27 08:01:57.878541+00

Remarquez comment la deuxième colonne diffère du résultat précédent. Il s'agit en fait de 20 heures de Brisbane exprimées en UTC :c'est probablement la réponse techniquement correcte à une question qui n'a pas beaucoup de sens.

Vous voulez probablement ceci :

EXTRACT (dow from (time AT TIME ZONE 'UTC') at time zone 'Brisbane/Australia')=0

qui devrait répondre :est-ce que la date et l'heure time tel que mesuré en UTC correspond à un dimanche à Brisbane ?