PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nazwy stref czasowych o identycznych właściwościach dają różne wyniki po zastosowaniu do znacznika czasu

Zaraz po tym, jak to opublikowałem, uruchomiłem kolejne zapytanie, aby sprawdzić podejrzenie:

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 się okazuje, istnieje również strefa czasowa skrót o nazwie CET (co ma sens, ponieważ „CET” jest skrótem). I wygląda na to, że PostgreSQL wybiera skrót zamiast pełnej nazwy. Tak więc, mimo że znalazłem CET w strefie czasowej nazwy , wyrażenie „2012-01-18 1:0 CET”::timestamptz jest interpretowane zgodnie z nieco innymi regułami dotyczącymi skrótów stref czasowych .

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

Znalazłem 10 przypadków skrótów stref czasowych w strefie czasowej nazwy i nie rozumiem, dlaczego one tam są. Jaki jest cel?

Wśród nich przesunięcie czasu (utc_offset ) nie zgadza się w czterech przypadkach ze względu na ustawienie czasu letniego:

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

W takich przypadkach ludzie mogą zostać oszukani (tak jak ja), wyszukując tz imię i znalezienie przesunięcia czasu, które nie jest faktycznie stosowane. To niefortunny projekt - jeśli nie błąd, to przynajmniej błąd dokumentacji .

W instrukcji nie mogę znaleźć niczego o niejasnościach między nazwami stref czasowych i skróty są rozwiązane. Oczywiście pierwszeństwo mają skróty.

Dodatek B.1. Interpretacja wprowadzania daty/godziny wspomina o wyszukiwaniu skrótów stref czasowych, ale pozostaje niejasne jak strefy czasowe nazwy są zidentyfikowane i który z nich ma pierwszeństwo w przypadku niejednoznacznego tokena.

Jeśli token jest ciągiem tekstowym, dopasuj możliwe ciągi:

Wykonaj wyszukiwanie w tabeli wyszukiwania binarnego dla tokena jako skrótu strefy czasowej.

Cóż, w tym zdaniu jest mała wskazówka, że ​​skróty są pierwsze, ale nic ostatecznego. Ponadto istnieje kolumna abbrev w obu tabelach pg_timezone_names i pg_timezone_abbrevs ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Psycopg2 zużywa pamięć przy dużym zapytaniu wybierającym

  2. Zdefiniować nazwy tabel i kolumn jako argumenty w funkcji plpgsql?

  3. Rails Migrations:próbowano zmienić typ kolumny z ciągu na liczbę całkowitą

  4. Jak obsłużyć błąd Ruby on Rails:Proszę zainstalować adapter postgresql:`gem install activerecord-postgresql-adapter'

  5. GET DIAGNOSTICS z poleceniem COPY w funkcji Pl/pgsql