Teradata Databaseには、一般的に使用できるタイムゾーンを表現する、タイムゾーン文字列一式が用意されています。サポートされているタイムゾーン文字列のリストについては、AT LOCALおよびAT TIME ZONEタイムゾーン指定子を参照してください。GetTimeZoneDisplacement UDFは、UTCとローカル タイムゾーン間の変換を実行するために、上記のタイムゾーン文字列と、それらに関連するルールを格納して保守します。
用意されているタイムゾーン文字列では要件が満たされない場合には、SYSLIBデータベースに格納されているGetTimeZoneDisplacement UDFに変更を加えて、タイムゾーン文字列を追加または変更してください。UDFのソース コードは、DBSパッケージの一部として入手できます。このソース コードは、/tdbms/etc/dem/srcに格納されています。
新しいタイムゾーン文字列を定義する場合や、既存のタイムゾーン文字列を追加または変更する場合には、次の手順を実行します。
- 既存のGetTimeZoneDisplacement UDFのバックアップ コピーを作成します。
# cd /home # mkdir workdir # cd workdir # cp /tdbms/etc/dem/src/udfgettimezonedisplacement.c .
- 既存のタイムゾーン文字列を修正するには、次の手順を実行します。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"}
- 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の形式が使用されます。 - このタイムゾーン文字列のエントリに関連付けられたルールと情報に変更を加えるか、そのエントリに新しいルールを追加します。
- GetTimeZoneDisplacement UDFのTZ_DST構造体の中から、タイムゾーン文字列のエントリを見つけます。 例えば、
- 新しいタイムゾーン文字列を追加するには、次の手順を実行します。
- 新しいタイムゾーン文字列とそれに関連するルールを追加するために、TZ_DST構造体の中に新しいエントリを作成します。tdlocaledef_tzrules.txtおよびudfgettimezonedisplacement.cのタイムゾーン文字列に基づくルールは、異なる形式でリストされます。tdlocaledefを実行してシステムにタイムゾーン文字列を設定するには、tdlocaledef_tzrules.txtの形式が使用されます。
- 新しいタイムゾーン文字列のエントリを、TZ_DST構造体内でのアルファベット順が保たれる位置に配置します。
- udfgettimezonedisplacement.cのMAX_DST_ENTRIESは、既存のタイムゾーン文字列に一致する必要があります。新しいタイムゾーン文字列を1つ追加すると、1つ増えます。
- 新しいタイムゾーン文字列とそれに関連するルールを追加するために、TZ_DST構造体の中に新しいエントリを作成します。
- 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' ;
- 新しいタイムゾーン文字列をテストします。
.os date .os date -u SELECT CURRENT_TIMESTAMP AS SYSTEMTIME, CURRENT_TIMESTAMP AT 'new_time_zone_string';