DB2/400の日付・時間系のデータ項目を調査しましたので、まとめておきたいと思います。
まず、DB2/400で定義できるデータタイプは、下記の通り。
今回、サンプルテーブルを準備し、RPG、Java(AS400内部ではなく、自分のローカルPCより実行)からその項目に書き込むためのサンプルを書いてみました。
データタイプ
| タイプ | 内容 |
|---|---|
| L | 日付型 |
| T | 時刻型 |
| Z | タイム・スタンプ型 |
サンプル・テーブル
TIGER/DBFSRC TEST02
A UNIQUE
A R RECW@00 TEXT('テスト・テーブル')
A*
A W@A001 10A COLHDG('キー')
A W@L001 L COLHDG(' 日付 ')
A W@T001 T COLHDG(' 時刻 ')
A W@Z001 Z COLHDG(' タイムスタンプ ')
A*
A K W@A001
サンプル・プログラム
RPG書き込みテスト
TIGER/RPGLESRC SAMPLE24
H DATEDIT(*YMD/)
H*
F**************************************************************************
F* ファイル定義
F**************************************************************************
FTEST02 UF A E K DISK
F*
D**************************************************************************
D* MAIN
D**************************************************************************
/FREE
CLEAR RECW@00;
W@A001 = 'RPG0000002';
W@Z001 = %TIMESTAMP();
W@L001 = %DATE();
// W@L001 = %DATE(20150120); // 日付を強制セットする場合
W@T001 = %TIME();
// W@T001 = %TIME(120000); // 時間を強制セットする場合
WRITE RECW@00;
*INLR = *ON;
RETURN;
/END-FREE
Java書き込みテスト
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; public class InsertDateFieldTest { static Connection conn = null; // JDBC(DB2/400) // jt400.jarをクラスパスに追加すること final static String DB_AS_DRIVER = "com.ibm.as400.access.AS400JDBCDriver"; final static String DB_AS_CONNECTION = "jdbc:as400://192.168.1.2"; final static String DB_AS_USER = "QUSER"; final static String DB_AS_PASSWORD = "********"; final static String DB400_DB_LIB_NAME = "TIGERDB"; public static void main(final String[] args) throws Exception { try { // JDBCドライバのロード Class.forName(DB_AS_DRIVER); conn = DriverManager.getConnection(DB_AS_CONNECTION, DB_AS_USER, DB_AS_PASSWORD); String strSql = "INSERT INTO " + DB400_DB_LIB_NAME + ".TEST02 (W@A001,W@Z001,W@L001,W@T001) " + " VALUES (?, ?, ?, ?) "; PreparedStatement pstmt = conn.prepareStatement(strSql); pstmt.setString(1, "0000000008"); pstmt.setTimestamp(2, new Timestamp(System.currentTimeMillis())); pstmt.setDate(3, new Date(System.currentTimeMillis())); //pstmt.setDate(3, java.sql.Date.valueOf("2015-01-20")); // 日付を強制セットする場合 pstmt.setTime(4, new Time(System.currentTimeMillis())); //pstmt.setTime(4, java.sql.Time.valueOf("20:30:00")); // 時間を強制セットする場合 pstmt.execute(); int count = pstmt.getUpdateCount(); System.out.println("登録件数 : " + count); pstmt.close(); } catch (SQLException e) { while (e != null) { System.err.println(e.getMessage()); System.err.println(e.getSQLState()); System.err.println(e.getErrorCode()); e = e.getNextException(); } } catch (Exception e) { e.printStackTrace(); } finally { conn.close(); } } }
どちらのプログラムからも、簡単に書き込みに成功しました。
わかったことは、どれも、ブランクとしての値を保持できない点でしょう(当たり前か。それはNULLでしょ!ってことですね)。
AS400内でNULLを認める設定もありますが、RPG内で「NULL許可項目を使用します!」と宣言しなければならないなど、何かと面倒に感じます。
日付に値が入らないような任意項目が必要な場合には、数値項目として日付項目の代用として行うという手もあります。
最後に、PGMにて日時系項目に値をセットしない場合にセットされる初期値については、下記を参照ください。
自分の環境(V7R01)で実行した結果になります。参考までに。。。
値をセットしない場合に自動格納されるデフォルト値について
| 言語 | タイプ | 結果 |
|---|---|---|
| RPGLE | タイムスタンプ | 0001-01-01-00.00.00.000000 |
| RPGLE | 日付 | 0001-01-01 |
| RPGLE | 時刻 | 00.00.00 |
| Java | タイムスタンプ | (実行環境での)現在日付+時刻 |
| Java | 日付 | (実行環境での)現在日付 |
| Java | 時刻 | (実行環境での)現在時刻 |