sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:välja rader som inträffar en viss dag i veckan, i en specifik tidszon

AT TIME ZONE när den tillämpas på en timestamp without timezone producerar en timestamp with timezone (och tvärtom). Och denna timestamp with timezone tolkas i din sessions tidszon (som i ditt fall tvingas till UTC ).

Alltså uttrycket EXTRACT (dow from time at time zone 'Brisbane/Australia') extraherar inte dagen i Brisbane vid time (UTC) , extraherar den dagen som motsvarar den konverterade time ur synvinkeln av någon som praktiskt taget bor i UTC-tidszonen.

Som ett exempel, när jag skriver detta, om jag låtsas vara i 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

Okej, det är söndag 18:01 i UTC och måndag 04:01 i Brisbane

Men om man tillämpar tidszonsförskjutningen på en 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

Lägg märke till hur den andra kolumnen skiljer sig från föregående resultat. Det är faktiskt 20 timmar ledigt från Brisbane uttryckt i UTC:det är förmodligen det tekniskt korrekta svaret på en fråga som inte är särskilt vettig.

Förmodligen vill du ha det här:

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

som ska svara:gör datum och tid time som mätt i UTC motsvarar en söndag i Brisbane?




  1. SQLFeatureNotSupportedException på getArray

  2. Storskaliga tillägg och raderingar Många-till-många-relationer i Entity Framework

  3. Det enklaste sättet att lägga till flera utrymmen till en sträng i MySQL – SPACE()

  4. Hur man hittar MySQL temporär tabelllagringsmotor