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())だと取得できない。

ということで、何気なくCREATE TABLE経由とpgAdminIII経由を混在させたDB構築/保守をしている場合は要注意。
ちなみに、ResultSet.getBigDecimal()もたまに取得できない場合があって、new BigDecimal(ResultSet.getString())としている。こうなると事前にnullチェックが必要。
継承してOverride・・・もやりにくいし、とても面倒である。

追記:補足しました。