A5:SQL Mk-2

開発のこと、日々のこと

【PostgreSQL】SQLを発行したときのタイムゾーンの扱い

ホーム フォーラム A5:SQL Mk-2掲示板 【PostgreSQL】SQLを発行したときのタイムゾーンの扱い

  • このトピックには2件の返信、1人の参加者があり、最後にsndにより1年前に更新されました。
3件の投稿を表示中 - 1 - 3件目 (全3件中)
  • 投稿者
    投稿
  • #20196 返信
    snd
    ゲスト

    A5mk2で、PostgreSQLに対し、SQLを発行したときのタイムゾーンに関してお伺いしたいです。

    ■質問
    A5Mk2では、SELECT発行時に、自前で「set session timezone」しているかにかかわらず、かならずシステムのタイムゾーンを設定して検索するのでしょうか?

    ■環境
    ・A5Mk2 2.17.4
    ・PostgreSQL13
    ・Windows11

    ■事象
    次のように、timestamp with time zone型を持つテーブルについて、データを登録し、

    create table timestamp_test (
    data_id varchar(2)
    ,ts timestamp without time zone
    ,tstz timestamp with time zone
    );

    以下の登録と検索をA5mk2上で行いました。

    (1)
    set session timezone to ‘UTC’;
    ①show timezone;
    insert into timestamp_test
    values (
    ‘A’
    ,TIMESTAMP WITH TIME ZONE ‘2023-04-14 00:00:00+02’
    ,TIMESTAMP WITH TIME ZONE ‘2023-04-14 00:00:00+02’
    );
    ②select * from timestamp_test order by data_id;
    ③show timezone;

    (2)
    set session timezone to ‘Asia/Tokyo’;
    ①show timezone;
    insert into timestamp_test
    values (
    ‘B’
    ,TIMESTAMP WITH TIME ZONE ‘2023-04-14 00:00:00+02’
    ,TIMESTAMP WITH TIME ZONE ‘2023-04-14 00:00:00+02’
    );
    ②select * from timestamp_test order by data_id;
    ③show timezone;

    それぞれ、「tstz」の項目について、②の検索結果は下記のように同一になりました。
    (1)② 2023/04/14 7:00:00
    (2)② 2023/04/14 7:00:00

    一方、同じSQLをpgAdmin4で実行したところ、下記のように異なるものになりました。
    (1)② 2023-04-13 22:00:00+00
    (2)② 2023-04-14 07:00:00+09

    *****
    このような差が出るのはどのような仕様によるものなのでしょうか。

    また、select時に内部的に「set session timezone」していると仮定して、
    (1)①と③のshow timezoneで「UTC」から「Asia/Tokyo」となるのかと思いましたが、ここは「UTC」のままでした。
    どのような仕組みなのでしょうか。

    ご教示いただけると幸いです。

    #20204 返信
    松原正和
    キーマスター

    snd さんこんにちは。
     
    pgAdmin4 でどのような仕組みになっているのかはよくわからなかったのですが、タイムゾーン付きタイムスタンプ(≒UTCでのタイムスタンプ)としてデータを受け取った後、文字列形式に変換する動作はクライアント側(A5:SQL Mk-2側)で行っています。
     
    この時、set session timezone to ‘Asia/Tokyo’; としてセッションのタイムゾーンを変更していたとしても、これは「サーバー側のセッションプロセス」なのでクライアント側(A5:SQL Mk-2側)は影響を受けません。
     
    なので、A5:SQL Mk-2では set session timezone の設定にかかわらず、クライアントOSのタイムゾーン情報に従って文字列化するので、このような結果になったのではないかと考えられます。
     
    都度、セッションのタイムゾーン情報を問い合わせてその情報に従って表示を行うというやり方もあるかとは思うのですが、そのために都度サーバーに問い合わせを行うのは少しやりすぎかなとも思えます。

    なお、SELECT 時にWHERE句の条件として文字列でタイムスタンプを指定したとき、おそらく想定と異なる結果を返す一因となるので、クライアントOSのタイムゾーンとサーバー側のセッションプロセスのタイムゾーンを異なる値に設定するのはお勧めしません。

    #20205 返信
    snd
    ゲスト

    お忙しいところ、ご回答助かりました。

    >これは「サーバー側のセッションプロセス」なのでクライアント側(A5:SQL Mk-2側)は影響を受けません。

    ここのところを認識できていませんでした。

    >A5:SQL Mk-2では set session timezone の設定にかかわらず、クライアントOSのタイムゾーン情報に従って文字列化する

    仕組みについて理解しました。ありがとうございます。

3件の投稿を表示中 - 1 - 3件目 (全3件中)
返信先: 【PostgreSQL】SQLを発行したときのタイムゾーンの扱い
あなたの情報:




コメントは受け付けていません。