sql >> データベース >  >> RDS >> PostgreSQL

同一のプロパティを持つタイムゾーン名は、タイムスタンプに適用すると異なる結果になります

    これを投稿した直後に、疑惑を確認するために別のクエリを実行しました:

    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
    

    結局のところ、あります タイムゾーンの略語 名前付きCET (これは理にかなっています。「CET」は略語です)。そして、PostgreSQLはフルネームよりも略語を選んでいるようです。だから、CETを見つけたのに タイムゾーンの名前 、式 '2012-01-18 1:0 CET' ::timestamptzは、タイムゾーンの省略形の微妙に異なる規則に従って解釈されます。 。

    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
    

    タイムゾーンの略語が10件見つかりました タイムゾーンの名前 そして、なぜそれらがそこにあるのか理解できません。目的は何ですか?

    その中で、時間オフセット(utc_offset )DST設定が原因で、4つのケースで一致しません:

    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
    

    このような場合、人々は(私がそうであったように)だまされて、tz nameを調べます。 実際に適用されていない時間オフセットを見つけます。これは残念な設計です。バグではないにしても、少なくともドキュメントのバグ

    タイムゾーンの名前間のあいまいさについて、マニュアルで何も見つかりません。 および略語 解決されます。明らかに略語が優先されます。

    付録B.1。日付/時刻入力の解釈では、タイムゾーンの略語の検索について言及していますが、不明のままです。 タイムゾーンの名前 トークンがあいまいな場合に識別され、どちらが優先されます。

    トークンがテキスト文字列の場合は、可能な文字列と一致させます。

    タイムゾーンの省略形としてトークンのバイナリ検索テーブルルックアップを実行します。

    さて、この文には略語が最初に来るというわずかなヒントがありますが、決定的なものは何もありません。また、abbrev列があります 両方のテーブルで、pg_timezone_names およびpg_timezone_abbrevs ...



    1. 文字列が複数の行を占める場合、AndroidStudioはKotlinRoomDAOクエリをチェック/ハイライトしません

    2. MariaDB JSON_MERGE_PRESERVE()の説明

    3. postgresのインストール中に入力したパスワードを忘れました

    4. MySQLでリストアイテムの位置を返す方法