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

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

Product
ODBC Driver for Teradata
Release Number
17.20
Published
2022年6月
Language
日本語
Last Update
2022-08-22
dita:mapPath
ja-JP/uqj1639470627591.ditamap
dita:ditavalPath
ja-JP/nkw1500504256726.ditaval
dita:id
B035-2526
Product Category
Teradata Tools and Utilities

セッションのDateTimeFormatを整数型に設定していて、テーブルが整数型のDATE、TIME、およびTIMESTAMPで作成されていた場合は、同じ結果が得られます。整数型時刻フォーマットは非推奨になったため、推奨されません。詳細については、ODBC Driver for Teradata 16.20以降のバージョンで非推奨になった機能の「整数型時刻」を参照してください。

変わったケースとして、セッションの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)

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

ユーザー アプリケーションが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文に追加できるかどうかを考慮します。

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

データベースでは、CURRENT_TIME(n)またはCURRENT_TIMESTAMP(n)の呼び出しでの秒の小数精度(n)は6に制限されています。ODBCでは、nに9を指定できます。ドライバはその値をそのままデータベースに渡し、6より大きい場合はエラーになります。

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

EXTRACT SQL文は、ODBC形式のタイトルが付けられた結果セットを生成します。データベースが生成するタイトルを使用する場合は、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 Driver 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文字型を使用する必要があります。