Cデータ型定義
typedef struct ANSI_TimeStamp_WZone { DECIMAL4 seconds; SMALLINT year; BYTEINT month; BYTEINT day; BYTEINT hour; BYTEINT minute; BYTEINT zone_hour; BYTEINT zone_minutes; } ANSI_TimeStamp_WZone;
使用
secondsメンバーはDECIMAL(8,6)型の数値フィールドであり、それにより秒の整数部2桁と小数点以下6桁までを表記できます。
SQL TIMESTAMP WITH TIME ZONE型に定義されている値の範囲は、関数の入力引数と戻り引数に適用されます。値の有効範囲外の値はエラーを生成します。TIMESTAMP WITH TIME ZONE型の詳細については、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。
UDFに渡すTIMESTAMP WITH TIME ZONE値のすべては、協定世界時(UTC)になります。また、UDFから返すTIMESTAMP WITH TIME ZONE値は、UTCにする必要があります。
TIMESTAMP WITH TIME ZONEのタイプには、タイムゾーン フィールドのzone_hourとzone_minuteが含まれています。これらのフィールドには、内部形式と外部形式があります。このタイプの入力引数をUDFに渡すときには、その値を内部形式にする必要があります。同様に、このタイプの戻り引数も、内部形式にする必要があります。
TIMESTAMP WITH TIME ZONEのタイプのタイムゾーン フィールドを変更するには、sqltypes_td.hファイルにある次に示すマクロを使用して、ANSI_Time_WzoneとANSI_TimeStamp_Wzoneのタイムゾーン フィールドの表現形式を内部と外部の間で変換します。
- TIMEZONE_INTERNAL_TO_EXTERNAL(i,s,h,m)
条件:
入力パラメータ 説明 i ANSI_Time_Wzoneへのポインタ。またはANSI_TimeStamp_Wzoneへのポインタ。 s iの符号を格納するBYTEINT値。 h iの時間オフセットを格納するBYTEINT値。 m iの分オフセットを格納するBYTEINT値。 - TIMEZONE_EXTERNAL_TO_INTERNAL(s,h,m,i)
条件:
入力パラメータ 説明 s iの符号を設定するBYTEINT値。 h iの時間オフセットを設定するBYTEINT値。 m iの分オフセットを設定するBYTEINT値。 i ANSI_Time_Wzoneへのポインタ。またはANSI_TimeStamp_Wzoneへのポインタ。
タイムゾーン フィールドの外部形式は、符号と、時間オフセット、分オフセットの3つの値で構成されます。それぞれの内容は、次のとおりです。
- 符号は、オフセットが負の場合は0、オフセットが正の場合は1のBYTEINT値になります。
- 外部形式の時間オフセットは、変換前と変換後のどちらも0から14のBYTEINT値になります。この値は、UTCと特定のタイムゾーン間の時間オフセットを表現します。
- 外部形式の分オフセットは、変換前と変換後のどちらも0から59のBYTEINT値になります。この値は、UTCと特定のタイムゾーン間の分オフセットを表現します。
負のオフセットの最大値は-12:59になります。正のオフセットの最大値は+14:00になります。
この表現では、2通りのUTC表現(+00:00と-00:00)をもたらすことになります。これは、どちらも表示目的で使用している内部表現をそのまま反映しています。
UDF定義とC関数宣言の中でTIMESTAMP WITH TIME ZONEを使用する例を以下に示します。
SQL関数定義 | 対応するC関数宣言 |
---|---|
CREATE FUNCTION F1 ( A TIMESTAMP WITH TIME ZONE) RETURNS INTEGER ...; |
void f1( ANSI_TimeStamp_WZone *a, INTEGER *result, ... ) { ... } |