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

Názvy časových pásem s identickými vlastnostmi poskytují při použití na časové razítko jiný výsledek

Hned poté, co jsem to zveřejnil, jsem spustil další dotaz, abych prověřil podezření:

SELECT * FROM pg_timezone_abbrevs
WHERE  abbrev IN ('CEST', 'CET');

 abbrev | utc_offset | is_dst
--------+------------+--------
 CEST   | 02:00:00   | t
 CET    | 01:00:00   | f

Jak se ukazuje, existuje také zkratka časového pásma s názvem CET (což dává smysl, "SEČ" je zkratka). A zdá se, že PostgreSQL vybírá zkratku přes celé jméno. Takže, i když jsem našel CET v časovém pásmu jména , výraz '2012-01-18 1:0 CET'::timestamptz je interpretován podle mírně odlišných pravidel pro zkratky časových pásem .

SELECT '2012-01-18 1:0 CEST'::timestamptz(0)
      ,'2012-01-18 1:0 CET'::timestamptz(0)
      ,'2012-01-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-01-18 00:00:00+01 | 2012-01-18 01:00:00+01 | 2012-01-18 01:00:00+01


SELECT '2012-08-18 1:0 CEST'::timestamptz(0)
      ,'2012-08-18 1:0 CET'::timestamptz(0)
      ,'2012-08-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-08-18 01:00:00+02 | 2012-08-18 02:00:00+02 | 2012-08-18 01:00:00+02

Našel jsem 10 případů zkratek časových pásem v časovém pásmu jména a nechápou, proč tam jsou. Jaký je účel?

Mezi nimi je časový posun (utc_offset ) nesouhlasí ve čtyřech případech kvůli nastavení DST:

SELECT n.*, a.*
FROM   pg_timezone_names n 
JOIN   pg_timezone_abbrevs a ON  a.abbrev = n.name
WHERE  n.utc_offset <> a.utc_offset;

 name | abbrev | utc_offset | is_dst | abbrev | utc_offset | is_dst
------+--------+------------+--------+--------+------------+--------
 CET  | CEST   | 02:00:00   | t      | CET    | 01:00:00   | f
 EET  | EEST   | 03:00:00   | t      | EET    | 02:00:00   | f
 MET  | MEST   | 02:00:00   | t      | MET    | 01:00:00   | f
 WET  | WEST   | 01:00:00   | t      | WET    | 00:00:00   | f

V těchto případech mohou být lidé oklamáni (jako jsem byl já), když vyhledávají jméno tz a nalezení časového posunu, který ve skutečnosti není aplikován. To je nešťastný návrh – když ne chyba, tak alespoň chyba v dokumentaci .

V manuálu jsem nenašel nic o tom, jak jsou nejasnosti mezi názvy časových pásem a zkratky jsou vyřešeny. Je zřejmé, že přednost mají zkratky.

Příloha B.1. Interpretace vstupu data/času zmiňuje vyhledávání zkratek časového pásma, ale zůstává nejasné jak časové pásmo názvy jsou identifikovány a který z nich má prioritu v případě nejednoznačného tokenu.

Pokud je token textový řetězec, porovnejte s možnými řetězci:

Proveďte binární vyhledávání v tabulce pro token jako zkratku časového pásma.

No, v této větě je lehký náznak, že zkratky jsou na prvním místě, ale nic definitivního. Je zde také sloupec abbrev v obou tabulkách pg_timezone_names a pg_timezone_abbrevs ...



  1. Jak vyřešit chybu `prisma/klient se ještě neinicializoval` na Vercelu

  2. Odstranění výchozího trasování – část 2

  3. mysqli_stmt::bind_result():Počet proměnných vazby neodpovídá počtu polí v připraveném příkazu

  4. Jak používat vlastnost IDENTITY() v SQL Server