memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

時刻付き日付をDerby&JSPで扱うプログラム例

※講義資料です。

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)