16.20 - タイムゾーン文字列の追加または修正 - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL日付と時刻の関数および式

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1211-162K-JPN

Teradata Databaseには、一般的に使用できるタイムゾーンを表現する、タイムゾーン文字列一式が用意されています。サポートされているタイムゾーン文字列のリストについては、AT LOCALおよびAT TIME ZONEタイムゾーン指定子を参照してください。GetTimeZoneDisplacement UDFは、UTCとローカル タイムゾーン間の変換を実行するために、上記のタイムゾーン文字列と、それらに関連するルールを格納して保守します。

用意されているタイムゾーン文字列では要件が満たされない場合には、SYSLIBデータベースに格納されているGetTimeZoneDisplacement UDFに変更を加えて、タイムゾーン文字列を追加または変更してください。UDFのソース コードは、DBSパッケージの一部として入手できます。このソース コードは、/tdbms/etc/dem/srcに格納されています。

新しいタイムゾーン文字列を定義する場合や、既存のタイムゾーン文字列を追加または変更する場合には、次の手順を実行します。

  1. 既存のGetTimeZoneDisplacement UDFのバックアップ コピーを作成します。
    # cd /home
    # mkdir workdir
    # cd workdir
    # cp /tdbms/etc/dem/src/udfgettimezonedisplacement.c .
    
  2. 既存のタイムゾーン文字列を修正するには、次の手順を実行します。
    tdlocaledef_tzrules.txtに提供されている既存のタイムゾーン設定のルール変更については、Teradataカスタマー サポート サービスにお問合わせください
    # cd /opt/teradata/tdat/tdbms/xx.xx.xx.xx/etc
    # vi tdlocaledef_tzrules.txt
    
    TimeZoneString {"America Eastern"; "-5"; "0"; "2";
         "4"; "4"; "1"; "0"; "0"; "02:00:00";
         "3"; "10"; "0"; "0"; "-1"; "02:00:00";
         "1987"; "2006"; "-5"; "0"; "-4"; "0";
              "4"; "3"; "8"; "0"; "0"; "02:00:00";
              "4"; "11"; "1"; "0"; "0"; "02:00:00";
              "2007"; "9999"; "-5"; "0"; "-4"; "0"}
    
    1. GetTimeZoneDisplacement UDFのTZ_DST構造体の中から、タイムゾーン文字列のエントリを見つけます。 例えば、
      {"America Eastern", 2,
        {{{4,  4, 1, 0, 0, "02:00:00"},
           {3, 10, 0, 0, -1, "02:00:00"},
           {1987, 2006, -5, 0, -4, 0}},
          {{4,  3, 8, 0, 0, "02:00:00"},
           {4, 11, 1, 0, 0, "02:00:00"},
           {2007, 9999, -5, 0, -4, 0}},
          {{0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, "00:00:00"},
           {0, 0, 0, 0, 0, 0}}
        },
        -5, 0
       },
      tdlocaledef_tzrules.txtおよびudfgettimezonedisplacement.cのタイムゾーン文字列に基づくルールは、異なる形式でリストされます。tdlocaledefを実行してシステムにタイムゾーン文字列を設定するには、tdlocaledef_tzrules.txtの形式が使用されます。
    2. このタイムゾーン文字列のエントリに関連付けられたルールと情報に変更を加えるか、そのエントリに新しいルールを追加します。
  3. 新しいタイムゾーン文字列を追加するには、次の手順を実行します。
    1. 新しいタイムゾーン文字列とそれに関連するルールを追加するために、TZ_DST構造体の中に新しいエントリを作成します。
      tdlocaledef_tzrules.txtおよびudfgettimezonedisplacement.cのタイムゾーン文字列に基づくルールは、異なる形式でリストされます。tdlocaledefを実行してシステムにタイムゾーン文字列を設定するには、tdlocaledef_tzrules.txtの形式が使用されます。
    2. 新しいタイムゾーン文字列のエントリを、TZ_DST構造体内でのアルファベット順が保たれる位置に配置します。
    3. udfgettimezonedisplacement.cのMAX_DST_ENTRIESは、既存のタイムゾーン文字列に一致する必要があります。新しいタイムゾーン文字列を1つ追加すると、1つ増えます。
  4. REPLACE FUNCTION文を使用して、このUDFを再コンパイルします。詳細は、<Teradata Vantage™ SQLデータ定義言語 - 構文規則および例、B035-1144>の「CREATE FUNCTION(外部形式)/REPLACE FUNCTION(外部形式)」を参照してください。
    必ずDBCとしてログインし、他のユーザーにはログオンさせないでください。

    例:

    Database SYSLIB;
    DROP FUNCTION GetTimeZoneDisplacement;
    REPLACE FUNCTION GetTimeZoneDisplacement
                     (tzstringinfo VARBYTE(130))
    RETURNS BYTE(340)
    LANGUAGE C
    NO SQL
    PARAMETER STYLE SQL
    EXTERNAL NAME 'CS!GetTimeZoneDisplacement!/home/workdir/udfgettimezonedisplacement.c' ; 
    
  5. 新しいタイムゾーン文字列をテストします。
    .os date
    .os date -u
    
    SELECT CURRENT_TIMESTAMP AS SYSTEMTIME,
           CURRENT_TIMESTAMP AT 'new_time_zone_string';