IBM Support

[Db2] タイム・スタンプのデータを特定のタイム・ゾーンで表示させる方法

Question & Answer


Question

TIMESTAMP 型データを別なタイム・ゾーンで表示させる方法を教えてください。

Cause

Db2 (LUW) は、Db2 for z/OS で使用可能な TIMESTAMP WITH TIME ZONE というタイム・ゾーン付タイム・スタンプ値を用いることはできませんが、表示したいタイム・ゾーンとの時差計算を含む照会や UDF (ユーザー定義関数) を用いることで、タイム・スタンプ型データを特定のタイム・ゾーンの表示にすることが可能です。

Answer

UTC (協定世界時)で表示したい場合には、CURRENT TIMESTAMP および CURRENT TIMEZONE 特殊レジスターを用いる方法があります。各タイム・ゾーンでの表示には、CURRENT TIMESTAMP との時差計算を用いた照会や UDF (ユーザー定義関数) を用いる方法が有効です。
Db2 11.1 以降であれば FROM_UTC_TIMESTAMP スカラー関数で指定したタイムゾーンの時刻を表示できます。
1. UTC での表示例
CURRENT TIMESTAMP は、稼働しているサーバーで SQL ステートメントが実行される時点の、 時刻機構の読み取り値にもとづくタイム・スタンプを指定します。CURRENT TIMEZONE は、UTC (協定世界時、旧 GMT) とアプリケーション・サーバーのローカル時との差が入ります。そのため、以下のようにして UTC でのタイム・スタンプの表示が可能です。
db2 "select current timestamp as local,
            current timezone as timezone,
            current timestamp - current timezone as UTC
       from sysibm.sysdummy1"

LOCAL                      TIMEZONE UTC                       
-------------------------- -------- --------------------------
2023-02-28-14.17.03.697806  -90000. 2023-02-28-05.17.03.697806

  1 record(s) selected.

 
2. UTC 以外のタイム・ゾーンでの表示例
UTC 以外のタイム・ゾーンについては、アプリケーション・サーバーのローカル時との時差計算を用いた照会や UDF を用いて表示させることができます。以下に、UDF を用い、日本時のサーバーで、タイム・スタンプを EST (東部時間) で表示をさせる場合の例を示します。

EST がサマータイムでない期間では 14 時間の時差となりますので、計算式に "-140000." を指定します。この指定形式では数値の2桁ごとに上位から、時・分・秒の意味になります。数値末尾のピリオドを忘れないようにしてください。
db2 "create function current_to_est()  
         returns timestamp  
           return (
             select current timestamp - 140000. 
             from sysibm.sysdummy1
           )"
           
db2 "select current timestamp as JST, current_to_est() as EST from sysibm.sysdummy1"

JST                        EST                       
-------------------------- --------------------------
2023-02-28-15.26.15.584823 2023-02-28-01.26.15.584823

  1 record(s) selected.
3. FROM_UTC_TIMESTAMP による指定したタイムゾーンの現在時刻表示例
Db2 11.1 以降であれば FROM_UTC_TIMESTAMP スカラー関数を使って、UTC をもとに指定したタイムゾーンの時刻を表示できます。
db2 values "from_utc_timestamp(current timestamp - current timezone, 'Asia/Tokyo')"

1
--------------------------
2023-02-28-06.44.16.778209

  1 record(s) selected.

運用上の考慮点

  • CURRENT TIMESTAMP は、稼働しているアプリケーション・サーバーの OS から時刻情報を収集して利用しているため、該当サーバーでサマータイムの調整が必要な場合、OS 側で対応する必要があります。
  • 上記の "-140000." の例のように、CURRENT TIMESTAMP との差分に固定値を利用する場合、表示したいタイム・ゾーンによっては、サマータイムを考慮して固定値の調整が必要となる場合があります。

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PkiAAE","label":"Administrative Tools"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
21 August 2023

UID

ibm16958689