PostgreSQLとJDBCの"Timestamp"の解釈
- CREATE TABLEの場合、TimestampとするとTimestamp without timezoneとして解釈される。
- pgAdminIIIで「新しい列...」では、Timestamp with/without timezoneのどちらかを指定しなければならない。
- 入力リストボックス上、Timestamp with timezoneが上にあるので、何気なく選択しやすい罠。
- ResultSet.getTimestamp()の挙動
- Timestamp without timezoneの場合、解釈されない。
- Bad Timestamp Format at 23 in 2007-07-10 18:38:00.775003
- Timestamp.valueOf(ResultSet.getString())で取得。事前にnullチェックが必要。
- Timestamp with timezoneの場合、解釈される。
- Timestamp.valueOf(ResultSet.getString())だと取得できない。
- Timestamp without timezoneの場合、解釈されない。
ということで、何気なくCREATE TABLE経由とpgAdminIII経由を混在させたDB構築/保守をしている場合は要注意。
ちなみに、ResultSet.getBigDecimal()もたまに取得できない場合があって、new BigDecimal(ResultSet.getString())としている。こうなると事前にnullチェックが必要。
継承してOverride・・・もやりにくいし、とても面倒である。
追記:補足しました。