Java Tips:現在の日時をデータベースに登録するにはJAVA Developer

フォームから受け取ったデータをデータベースに登録(挿入)する場合、フォームのデータとは別に、現在の日時を含めたい時がある。この方法には、プログラムで現在の日時データをSQL文に埋め込む方法と、SQL文にデータベースの対応する関数を指定する方法が挙げられる。

» 2004年07月23日 06時40分 公開
[ITmedia]

java.sql.Timestampクラスを使う

 日付と時刻を登録するデータベースのデータ型は,データベースによって多少の違いがあります。ここでは多くのデータベースがサポートしている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関数を使う

 主要なデータベースでは,現在の日時を取得する関数として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が実行されデータベースの登録直前の日時が登録されるところです。

Oracleデータベースは,Oracle9i(R9.0.1)からCURRENT_TIMESTAMP関数をサポートしています。またDB2では,従来,CURRENTとTIMESTAMPの間にスペースを入れて使用していましたが,現バージョンではCURRENT_TIMESTAMPと記述することも可能です。

 「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ