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

PostgreSQLでのtimezone()関数のしくみ

    PostgreSQLでは、timezone()を使用できます タイムスタンプを別のタイムゾーンに変換する関数。

    構文

    構文は次のようになります:

    timezone(zone, timestamp)

    zone timestampが必要なタイムゾーンです 変換される引数。

    得られる結果は、元のタイムスタンプ値にタイムゾーンが含まれているかどうか(およびその値が何であるか)によって異なります。

    例1-元のタイムスタンプにタイムゾーンが含まれている場合

    元のタイムスタンプにタイムゾーンが含まれている場合は、次のようになります。

    SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');

    結果:

    2020-10-25 04:00:00

    元のタイムスタンプにタイムゾーンが含まれている場合、timezone() 関数は、元のタイムスタンプ値を指定されたタイムゾーンにシフトし、タイムゾーンなしの値を返します。

    入力タイムスタンプのタイムゾーンを変更するとどうなりますか。

    SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');

    結果:

    2020-10-25 03:00:00

    結果のタイムスタンプは、入力されたタイムゾーンに従ってシフトされます。

    また、timestamp with time zoneを指定した場合 、ただし、元のタイムスタンプに実際にはタイムゾーンが含まれていない場合、元のタイムスタンプ値はローカルタイムゾーンにシフトされます。

    SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');

    結果:

    2020-10-24 18:00:00

    この場合、結果のタイムスタンプは6時間戻されています。これは、私のローカルタイムゾーンがインド/モーリシャスより6時間進んでいることを意味します。

    入力値を直接選択することで、使用されたタイムゾーンオフセットを確認できます。

    SELECT timestamp with time zone '2020-10-25 00:00:00';

    結果:

    2020-10-25 00:00:00+10

    例2–元のタイムスタンプにタイムゾーンが含まれていない場合

    元のタイムスタンプがない場合は次のようになります。 タイムゾーンを含めます。

    SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');

    結果:

    2020-10-25 06:00:00+10

    元のタイムスタンプにタイムゾーンが含まれていない場合、結果は現在のTimeZoneを使用して表示されます 設定とタイムゾーンオフセットが追加されます。

    これは、timestamp without time zoneを指定するたびに適用されます 、タイムスタンプに実際にタイムゾーンオフセットが含まれている場合でも。

    SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');

    結果:

    2020-10-25 06:00:00+10

    timestamp without time zoneだけを選択すると、これは予想されることです。 値、これは私が得るものです:

    SELECT timestamp without time zone '2020-10-25 00:00:00+12';

    結果:

    2020-10-25 00:00:00

    例3– localtimestamp

    localtimestampを使用しましょう 自分のタイムゾーンの現在のタイムスタンプと、timezone()を使用した後の結果のタイムスタンプとの比較を実行する関数 別のタイムゾーンに変換する関数。

    \x
    SELECT 
      localtimestamp,
      timezone('Indian/Mauritius', localtimestamp);

    結果:

    localtimestamp | 2020-07-08 15:42:04.965221
    timezone       | 2020-07-08 21:42:04.965221+10

    localtimestamp 関数はタイムスタンプを返します データ型。暗黙の「タイムゾーンなし」が付属しています。つまり、タイムスタンプ およびタイムゾーンのないタイムスタンプ 同じことです。

    前に示したように、元のタイムスタンプにタイムゾーンが指定されていない場合、現在のTimeZone 設定が使用され、結果に追加されます。これが、localtimestampを使用したときに得られるものです。 。

    ちなみに、この例では\xを使用しました 読みやすくするために、拡張表示/垂直出力を使用して結果を表示します。

    例4– current_timestamp

    それでは、current_timestampを使用しましょう localtimestampの代わりに関数 。

    SELECT 
      current_timestamp,
      timezone('Indian/Mauritius', current_timestamp);

    結果(垂直出力を使用):

    current_timestamp | 2020-07-08 15:42:04.335669+10
    timezone          | 2020-07-08 09:42:04.335669

    今回は、タイムゾーンオフセットが元のタイムスタンプに追加され、timezone() 結果には含まれなくなりました。

    current_timestampが原因で、この結果が得られます 関数はタイムゾーン付きのタイムスタンプを返します データ型。

    例5–時間値の使用

    timezone() 関数はtimeでも機能します 値(time with time zone およびtime without time zone

    ただし、time with time zoneで使用する場合 値の場合、タイムゾーンオフセットが結果に追加されます。

    SELECT 
      timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
      timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
      timezone('Indian/Mauritius', time with time zone '00:00:00');

    結果(垂直出力を使用):

    timezone | 04:00:00+04
    timezone | 03:00:00+04
    timezone | 18:00:00+04

    完全を期すために、time without time zoneを使用した同じ値を次に示します。 データ型。

    SELECT 
      timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
      timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
      timezone('Indian/Mauritius', time without time zone '00:00:00');

    結果(垂直出力を使用):

    timezone | 18:00:00+04
    timezone | 18:00:00+04
    timezone | 18:00:00+04

    ローカルタイムゾーンを確認する

    自分のローカルタイムゾーンを確認する場合は、SHOW TIMEZONEを実行します 。

    そのコマンドを実行すると、次のようになります。

    SHOW TIMEZONE;

    結果:

    Australia/Brisbane

    タイムゾーンオフセットを確認する

    上記の知識があれば、pg_timezone_namesにクエリを実行して、2つのタイムゾーンオフセットを確認できます。 ビュー。

    SELECT * 
    FROM pg_timezone_names
    WHERE name = 'Indian/Mauritius'
    OR name = 'Australia/Brisbane';

    結果(垂直出力を使用):

    name                | abbrev | utc_offset | is_dst
    --------------------+--------+------------+--------
    Indian/Mauritius    | +04    | 04:00:00   | f
    Australia/Brisbane  | AEST   | 10:00:00   | f

    Postgresでタイムゾーンを返すためのその他のオプションと例については、PostgreSQLでサポートされているタイムゾーンのリストを返すを参照してください。


    1. R12および11iでOTAを設定する方法

    2. R12.2オンラインパッチ準備レポート

    3. OracleDatabaseでデータベースオブジェクトとしてVARRAYを作成する方法

    4. SMALLDATETIMEFROMPARTS()SQL Server(T-SQL)の例