ODBC により SQL_TIMESTAMP と認識されるデータ型、IBM i 固有の型である Timestamp(Z) 型に関する注意事項を説明します。これは日付と時刻をひとまとめに格納する型です。

Timestamp型の列をLANSAデータ・ディクショナリの列にインポートする際、この列にASQN(Allow SQL NULL)属性が設定されていなければ、NULL値は省略値である「1900-01-01」になります。この値が目的に適っているかどうか、確認する必要があります。

列長は19~29バイトで、プラットフォームによって異なります。

システム変数*TIMESTAMP_DFT、*TIMESTAMP_LOVAL、*TIMESTAMP_HIVALも使えます。IBM i以外のプラットフォームの場合、*TIMESTAMP_DFT、*TIMESTAMP_LOVALはどちらも「1900-01-01 00:00:00.000000」となります。一方、IBM iの場合は、「0001-01-01.00.00.00.000000」となります。*TIMESTAMP_HIVALはいずれのプラットフォームでも「9999-12-31」です。

*TIMESTAMP_XXX変数は、列長が26バイト以上の場合に限り、省略値として指定できます。これより短い列に適用したい場合は、長さ26バイトの仮想列を用意し、変換してください。

英数字型の列については、次のいずれかの書式にする必要があります。

  • 日付、時刻とも揃った形:YYYY-MM-DD HH:MM:SS[.f....]
    秒までの値は必須ですが、秒未満の桁は、プラットフォーム側の計時機能が秒未満の単位に対応している場合にのみ指定できます。なお、列長はこの桁の分多く必要です。
    テーブルからデータを読み込むと、列値は常にこの書式になります。ただし、テーブル上の値がNULLであった場合は空文字列です。これはTimestamp型の値として無効なので、行を更新すると、省略値である*TIMESTAMP_DFTになります。

  • 日付のみの形 (YYYY-MM-DD)
    列を挿入/更新すると、時刻の部分は自動的に「00:00:00」となります。

  • 時刻のみの形(HH:MM:SS.[f...])
    列を挿入すると、日付の部分は「1900-01-01」となります。書式に関しては、日付、時刻とも揃った形と同じ規則が成り立ちます。秒未満の桁についても同様です。

  • 列をI/Oコマンドで使用したときに書式が正しくない場合、致命的なエラーが発生します。DBMS側の書式変換機能により、これ以外の書式であってもエラーにならない場合がありますが、推奨はしません。データを手入力する場合は、いったん仮想列に入れ、そこから上記の書式に変換するようにしてください。



次のトピックも参照してください。

SQL Serverのデータ型Smalldatetimeの使い方

IBM i RDMLX外部テーブル

  • No labels