環境
Oracle JDBC Thin Driver 12.1.0.2 (ojdbc7.jar利用)
JDK 8
事象
JDBC経由でOracle DatabaseのTIMESTAMP WITH TIME ZONEにUTC形式でInsertしたいのに、TZR形式でInsertされる場合がある
例えば下記のようなSQLをSQL*PlusでInsertした場合と、JDBCでInsertした場合に差異が発生する。
insert into test_update values(22,'2018-07-25 19:24:46.792')
・SQL*Plus inset結果
25-JUL-18 07.24.46.792000 PM +09:00
・JDBC経由 inset結果
25-JUL-18 07.24.46.792000 PM ASIA/TOKYO
※TIMESTAMP WITH TIME ZONEのカラムのみ抜粋
解決策
1.書式を明記してInsert
insert into test_update values(24,'2018-07-25 19:24:47.323','25-JUL-18 03.16.54.752000 PM +09:00);
2.セッションのtime_zoneをUTC指定にする
下記alter文を発行してInsert
alter session set time_zone='+09:00'
3.プログラム実行時にtime_zoneをUTC指定にする
java -Duser.timezone=+09:00 ...
備考
java VMのローカルタイムゾーンが使用されており、そこがtime_zone='ASIA/TOKYO'と同義の設定を行っているのかなと思っているが、だれがどこで制御しているのかまでは追えていない