DateTimeFormatの互換性と精度 - ODBC Driver for Teradata

ODBC Driver for Teradata® ユーザー ガイド

Product
ODBC Driver for Teradata
Release Number
16.20
Published
2018年10月
Language
日本語
Last Update
2019-02-12
dita:mapPath
ja-JP/fxv1527114222338.ditamap
dita:ditavalPath
ja-JP/fxv1527114222338.ditaval
dita:id
B035-2526
Product Category
Teradata Tools and Utilities

セッションDateTimeFormatを古い形式に設定し、ユーザーのテーブルが古い形式のDATE、TIMEおよびTIMESTAMPで作成された場合は、同じ結果が得られます。整数型時刻形式は廃止されたため、推奨されません。 詳細については、<整数型時刻>を参照してください。

さらに変わったケースとして、セッションDateTimeFormatを旧式に設定しようとした場合に、テーブルがすでにANSIのDATEや、TIME、TIMESTAMPで作成されている場合があります。

セッションのDateTimeFormatがANSIの場合、以下のSQL文では、ANSI TIME型の列が作成され、秒の小数精度が6(hh:mm:ss.ffffff)になります。これは、Teradataのデフォルトの小数部分の精度が0桁でなく6桁であるためです。

CREATE TABLE tablename (c1 TIME)

これらのデータ型間におけるTIMEやTIMESTAMPの秒の小数部分の精度を、次の表に示します。

TIME/TIMESTAMPのタイプ 精度の制限
TeradataのANSI TIME 最大15文字(hh:mm:ss.ffffff)
TeradataのANSI TIMESTAMP 最大26文字(yyyy-mm-dd hh:mm:ss.ffffff)

Teradataから文字列を取り出してTIMESTAMPに変換するよう要求された場合、ドライバは、TIMESTAMPを26文字で切り捨て、警告を生成します。同様に、文字列を取り出してTIMEに変換する場合、ドライバはTIMEを15文字で切り捨て、警告を生成します。TeradataからTIMESTAMPを取り出してTIMEに変換するよう要求された場合、ドライバは、SQL_SUCCESS_WITH_INFOと01S07を返します。これは、SQL_TIMESTAMPからSQL_C_TIMEに変換する場合のODBC仕様の要件です。ドライバが警告なしで小数部分を切り捨てるのは、TimeのDateTimeFormat DSNオプションを整数に設定して小数部分のフィールドを含む文字列を取り出し、SQL_C_TIMEに変換する場合(SQL_CHARからSQL_C_TIMEへの変換)のみです。それ以外の場合は警告なしで切り捨てられることはなく、ODBC仕様の要件に従って、ドライバはSQL_SUCCESS_WITH_INFOと01S07 SQLSTATEを返します。

ユーザー アプリケーションがSQLBindParameterを呼び出して、TIMEまたはTIMESTAMPとして使用されるサイズ超過文字列を含むバッファへのポインタを渡すと、警告なしで秒の小数部分が切り捨てられることがあります。

ユーザー アプリケーションがSQLBindParameterを呼び出して、セッションDateTimeFormatが旧式に設定されている場合、TeradataのANSI形式の接頭辞付きのDATE、TIME、またはTIMESTAMP(TIME '14:25:00'など)を含むバッファへのポインタを渡すことはできません。ANSI形式の接頭辞なしのDATE、TIME、TIMESTAMPは有効です。ODBC構文のDATE、TIME、またはTIMESTAMPリテラルは、DateTimeFormatの値にかかわらず、どんな場合でも有効です。

ANSIのTIMEおよびTIMESTAMPは整数計算できません。次のSQL文は失敗します。

SELECT ((TIME '12:13:14')(integer))/10000

セッションDateTimeFormatを旧式に設定するときと、ANSIに設定するときのトレードオフを検討する場合には、TIMEまたはTIMESTAMPで整数算術を行う必要があるかどうかを考えます。

ANSIのTIMEまたはTIMESTAMPに対してパラメータ化SQLを実行する場合は、SQL文で以下のようにCASTを使用する必要があります。

SELECT * FROM table WHERE columnname = CAST ((?) AS TIME(6))

セッションDateTimeFormatを設定する方法を決定する際には、これらのCASTをSQL文に追加することができるかどうかを考慮する必要があります。

Teradata Databaseでは、ANSIのCURRENT_DATE、CURRENT_TIMEおよびCURRENT_TIMESTAMPの各関数がサポートされます。

Teradataでは、CURRENT_TIME(n)またはCURRENT_TIMESTAMP(n)の呼び出しにおいて、秒の小数精度(n)が6桁に制限されます。ODBCの場合、nは9になります。ドライバはその値をそのままTeradataに渡し、その値が6よりも大きい場合はエラーが生成されます。

ODBCスカラー関数であるCURDATEとCURTIME、さらにはSQL文であるDATE、TIMEを引き続き使用できます。

EXTRACT SQL文は、ODBC形式のタイトルが付けられた結果セットを生成します。Teradataが生成するタイトルを使用する場合は、SQLSetStmtOptionまたはSQLSetStmtAttrを使用してSQL_NOSCANオプションをオンにするようにし、DATE、TIME、およびTIMESTAMPリテラルのODBC構文は使用しないでください。または、EXTRACT SQL文の後で、独自のタイトルを指定するという方法もあります。

EXTRACTを使用しても、タイムゾーンを含んでいないANSIのTIMEまたはTIMESTAMPからデフォルトのタイムゾーンを取得することはできません。EXTRACTを使用して、時間帯を含むANSIのTIMEまたはTIMESTAMPから時間帯を取得する場合は、TIMEまたはTIMESTAMP接頭辞を使用しなければなりません。

SELECT EXTRACT (TIMEZONE_HOUR FROM TIME '12:13:14+07:00')

ODBC Drive for Teradataでは、TIME WITH TIME ZONEとTIMESTAMP WITH TIME ZONEの両方がSQL_TYPE_TIMEにマップされます。タイムゾーン値はSQL_C_TYPE_TIMEまたはSQL_C_TYPE_TIMESTAMPへの値変換時に切り捨てられますが、いずれかのODBC C文字型にマップされたときは保持されます。そのため、タイムゾーン値が必要なアプリケーションでは、ODBC C文字型を使用する必要があります。