sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:výběr řádků, které se vyskytují v určitý den v týdnu, v určitém časovém pásmu

AT TIME ZONE při použití na timestamp without timezone vytvoří timestamp with timezone (a naopak). A toto timestamp with timezone je interpretováno v časovém pásmu vaší relace (které je ve vašem případě nuceno na UTC ).

Takže výraz EXTRACT (dow from time at time zone 'Brisbane/Australia') neextrahuje den v Brisbane v time (UTC) , extrahuje den odpovídající převedenému time z pohledu někoho, kdo virtuálně žije v časovém pásmu UTC.

Jako příklad, když to píšu, když předstírám, že jsem v 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

Dobře, je neděle 18:01 v UTC a pondělí 4:01 v Brisbane

Ale pokud použijete posunutí časového pásma na 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

Všimněte si, jak se druhý sloupec liší od předchozího výsledku. Ve skutečnosti je to 20 hodin volna od Brisbane vyjádřeno v UTC:je to pravděpodobně technicky správná odpověď na otázku, která nedává moc smysl.

Pravděpodobně chcete toto:

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

která by měla odpovědět:dělá datum a čas time měřeno v UTC odpovídá neděli v Brisbane?




  1. Jak zabránit časovým limitům připojení u velkých importů MySQL

  2. Jak převést normální dotaz na křížový dotaz v Accessu

  3. V Rails nelze vytvořit databázi pro {adapter=>postgresql,

  4. Rozdíl mezi real_escape_string a Prepare()?