※講義資料です。
JSP&DerbyでRTMをチーム開発している学生さんからの質問で、時刻付きの日付データをデータベースに格納&取り出すプログラムはどう書けばいいですか?という質問がありました。
そういえば、(仕事では重要になるはずの)日付や時刻をデータベースで扱う演習をやってこなかったな。。。と思い、来年の講義に入れるためにもちょっと調べてみました。DBMSによって方言があるのでDerbyの場合はどうでしょう?以下がとりあえず1つの答えです。もっといい方法があるかもしれません。
サンプルのテーブルは以下です。制約はなにもつけていません。時刻付きの日付を保存するためtimestampというタイプを使います。ついでにテスト用のinsert文も入れておきます。
create table todo ( hiduke timestamp, yotei varchar(100) ); insert into todo values ('2010-12-10 10:00:00', 'test1'); insert into todo values ('2010-12-12 16:00:00', 'test2'); insert into todo values ('2010-12-12 10:00:00', 'test3');
で、サンプルのJSPが以下。プログラムを短くするためfinallyでcloseしていません。TODOのhidukeとhidukeと今日の差(期限までの猶予日数)を表示します。
<%@ page language="java" contentType="text/html; charset=Shift_JIS" pageEncoding="Shift_JIS" import="java.util.*, java.text.*, java.sql.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>Insert title here</title> </head> <body> <% try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); Properties prop = new Properties(); prop.put("user", "test"); prop.put("password", "test"); Connection con = DriverManager.getConnection("jdbc:derby:/Users/xxxx/MyDB",prop); con.setAutoCommit(true); Statement state = con.createStatement(); String query = "select * from todo order by hiduke desc"; ResultSet rs = state.executeQuery(query); java.util.Date today = new java.util.Date(); SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); while(rs.next()){ java.util.Date d = rs.getTimestamp("hiduke"); out.print(f.format(d)+" ("+(d.getTime()-today.getTime())/(1000*60*60*24)+")<br>"); } rs.close(); state.close(); con.close(); } catch(Exception ex){ ex.printStackTrace(); } %> </body> </html>
参考まで実行結果は以下です。()内が猶予日数です。参考にしてください。
2010/12/12 04:00:00 (3)
2010/12/12 10:00:00 (2)
2010/12/10 10:00:00 (0)