フォームから受け取ったデータをデータベースに登録(挿入)する場合、フォームのデータとは別に、現在の日時を含めたい時がある。この方法には、プログラムで現在の日時データをSQL文に埋め込む方法と、SQL文にデータベースの対応する関数を指定する方法が挙げられる。
日付と時刻を登録するデータベースのデータ型は,データベースによって多少の違いがあります。ここでは多くのデータベースがサポートしているtimestamp型を使用し,次に示すSQL文でテーブルを定義します。動作を確認したデータベースはMySQLですが,基本的にほかのデータベースでも利用できます(JDBCドライバの設定を除く)。
CREATE TABLE mailmagazine (
mail varchar(64),
entry timestamp
);
このmailmagazineテーブルに対し,データを登録することを考えて見ましょう。
Javaには現在の日時を取得する方法としては,System#currentTimeMillisメソッドを使う方法や,java.util.Calendarクラスを使う方法などがあります。JDBCでは,データベースのtimestamp型に対応するクラスとしてjava.sql.Timestampクラスを用意しています。Timestampクラスのコンストラクタは,時間を表すlong値(ミリ秒)がパラメータですから,ここではSystem#currentTimeMillisメソッドを利用します。
リスト1 プログラムでSQL文に現在の日時を埋め込んで登録(抜粋)
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost/testdb","user","pass");
PreparedStatement ps = con.prepareStatement(
"INSERT INTO mailmagazine VALUES(?, ?)");
ps.setString(1, mail);
ps.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
ps.execute();
実際にmailに"abcdefgh@softbank.co.jp"をセットして実行し,MySQLのコンソールでデータを確認します。
mysql> select * from mailmagazine;
+-------------------------+----------------+
| mail | entry |
+-------------------------+----------------+
| abcdefgh@softbank.co.jp | 20040710204953 |
+-------------------------+----------------+
データを登録した時点での時間が挿入されていることがわかります。なお,setTimestamp(int, Timestamp)を使った場合はタイムゾーンによる影響を受けません。Timestampクラスのコンストラクタで設定した値がSQLのtimestamp型に変換され,そのままデータベースに登録されます。
主要なデータベースでは,現在の日時を取得する関数としてCURRENT_TIMESTAMP関数を利用できます。いくつかのデータベースは現在の日時を取得する独自の関数も用意していますが,ポータビリティを考慮するとANSIで規定されているCURRENT_TIMESTAMP関数を利用するほうがよいでしょう。
CURRENT_TIMESTAMP関数を使う場合は,SQL文にそのまま記述するだけです。
リスト2 CURRENT_TIMESTAMP関数を使って現在の日時を登録(抜粋)
PreparedStatement ps = con.prepareStatement(
"INSERT INTO mailmagazine VALUES(?, CURRENT_TIMESTAMP)");
ps.setString(1, mail);
ps.execute();
今度はmailに"testtest@softbank.co.jp"をセットして実行し,さきほどと同じようにMySQLのコンソールで登録されたデータを確認します。
mysql> select * from mailmagazine;
+-------------------------+----------------+
| mail | entry |
+-------------------------+----------------+
| abcdefgh@softbank.co.jp | 20040710204953 |
| testtest@softbank.co.jp | 20040710205325 |
+-------------------------+----------------+
リスト1と同じようにデータを登録した時点での時間が挿入されていることがわかります。リスト1とリスト2の基本的な違いは,リスト1が登録する日時がSQLを発行する前の日時なのに対し,リスト2はSQLが実行されデータベースの登録直前の日時が登録されるところです。
「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.