PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:selecionando linhas que ocorrem em um determinado dia da semana, em um fuso horário específico


AT TIME ZONE quando aplicado a um timestamp without timezone produz um timestamp with timezone (e vice-versa). E este timestamp with timezone é interpretado no fuso horário da sua sessão (que no seu caso é forçado a UTC ).

Portanto, a expressão EXTRACT (dow from time at time zone 'Brisbane/Australia') não extrai o dia em Brisbane às time (UTC) , ele extrai o dia correspondente ao time convertido do ponto de vista de alguém que vive virtualmente no fuso horário UTC.

Como exemplo, quando estou digitando isso, se fingir estar em 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

Tudo bem, é domingo 18:01 em UTC e segunda 04:01 em Brisbane

Mas se aplicar o deslocamento de fuso horário a um 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

Observe como a segunda coluna difere do resultado anterior. Na verdade, são 20 horas de distância de Brisbane expressas em UTC:é presumivelmente a resposta tecnicamente correta para uma pergunta que não faz muito sentido.

Provavelmente você quer isso:
EXTRACT (dow from (time AT TIME ZONE 'UTC') at time zone 'Brisbane/Australia')=0

que deve responder:a data e a hora time medida em UTC corresponde a um domingo em Brisbane?