PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:selezione di righe che si verificano in un determinato giorno della settimana, in un fuso orario specifico

AT TIME ZONE quando applicato a un timestamp without timezone produce un timestamp with timezone (e viceversa). E questo timestamp with timezone viene interpretato nel fuso orario della tua sessione (che nel tuo caso è forzato a UTC ).

Quindi l'espressione EXTRACT (dow from time at time zone 'Brisbane/Australia') non estrae il giorno a Brisbane alle time (UTC) , estrae il giorno corrispondente all'time convertita dal punto di vista di qualcuno che vive virtualmente nel fuso orario UTC.

Ad esempio, quando sto digitando questo, se fingo di essere in 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

Bene, sono le 18:01 di domenica in UTC e le 04:01 di lunedì a Brisbane

Ma se si applica lo spostamento del fuso orario a 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

Nota come la seconda colonna differisce dal risultato precedente. In realtà sono 20 ore fuori Brisbane espresse in UTC:presumibilmente è la risposta tecnicamente corretta a una domanda che non ha molto senso.

Presumibilmente vuoi questo:

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

che dovrebbe rispondere:fa la data e l'ora time come misurato in UTC corrisponde a una domenica a Brisbane?