PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Auswählen von Zeilen, die an einem bestimmten Wochentag in einer bestimmten Zeitzone auftreten

AT TIME ZONE bei Anwendung auf einen timestamp without timezone erzeugt einen timestamp with timezone (und umgekehrt). Und dieser timestamp with timezone wird in der Zeitzone Ihrer Sitzung interpretiert (die in Ihrem Fall auf UTC gezwungen wird ).

Also der Ausdruck EXTRACT (dow from time at time zone 'Brisbane/Australia') extrahiert nicht den Tag in Brisbane um time (UTC) , extrahiert es den Tag, der der konvertierten time entspricht aus der Sicht einer Person, die virtuell in der UTC-Zeitzone lebt.

Als Beispiel, wenn ich dies tippe, wenn ich vorgebe, in UTC zu sein:

=> 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

Gut, es ist Sonntag 18:01 in UTC und Montag 04:01 in Brisbane

Aber wenn die Zeitzonenverschiebung auf einen timestamp without timezone angewendet wird :

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

Beachten Sie, wie sich die zweite Spalte vom vorherigen Ergebnis unterscheidet. Es ist tatsächlich 20 Stunden von Brisbane entfernt, ausgedrückt in UTC:Es ist vermutlich die technisch korrekte Antwort auf eine Frage, die nicht viel Sinn ergibt.

Vermutlich möchten Sie dies:

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

was antworten sollte:macht das Datum und die Uhrzeit time gemessen in UTC entspricht einem Sonntag in Brisbane?