sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:selección de filas que ocurren en un determinado día de la semana, en una zona horaria específica

AT TIME ZONE cuando se aplica a una timestamp without timezone produce una timestamp with timezone (Y a la inversa). Y esta timestamp with timezone se interpreta en la zona horaria de su sesión (que en su caso está forzada a UTC ).

Entonces, la expresión EXTRACT (dow from time at time zone 'Brisbane/Australia') no extrae el día en Brisbane a la time (UTC) , extrae el día correspondiente a la time convertida desde el punto de vista de alguien que vive virtualmente en la zona horaria UTC.

Como ejemplo, cuando escribo esto, si pretendo estar 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, es el domingo a las 18:01 en UTC y el lunes a las 04:01 en Brisbane

Pero si se aplica el desplazamiento de la zona horaria a una 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 cómo la segunda columna difiere del resultado anterior. En realidad, son 20 horas menos que Brisbane expresadas en UTC:presumiblemente es la respuesta técnicamente correcta a una pregunta que no tiene mucho sentido.

Presumiblemente quieres esto:

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

que debería responder:la fecha y la hora time como se mide en UTC corresponde a un domingo en Brisbane?