【发布时间】:2014-12-10 06:10:41
【问题描述】:
我在 oracle 中有一个日期类型,我想在其中插入 unix 时间戳数据。
我在 PL/SQL 中使用这个 SQL 查询,它有效。
select TO_DATE('19700101','yyyymmdd') + 1413360712/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24 from dual;
输出是正确的。
2014/10/15 16:11:52
但是当我在java中使用它时,输出是不同的。
String sql = "insert into appliance_application (id, emp_id, typeid, num, spec, action, actiontime, oper_id) VALUES(applianceapplication_seq.nextval, ?, ?, ?, ?, ?, TO_DATE('19700101','yyyymmdd') + 1413360712/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24, ?)";
pstmt = conn.prepareStatement(sql);
for(int i=0; i < list.size(); i++){
Itembean ib = (Itembean)list.get(i);
pstmt.setObject(1, ib.getEmpid());
...
pstmt.setObject(5, ib.getAction());
// pstmt.setLong(6, ib.getActiontime());
// pstmt.setObject(7, ib.getOper_id());
pstmt.setObject(6, ib.getOper_id());
log.info(ib.getActiontime()+ "....");
pstmt.addBatch();
}
...
我检查插入的数据,发现输出错误。
2014/10/15 8:11:52
我的会话时区是 +8。 怎么了?
【问题讨论】:
-
你确定Java会话的
sessiontimezone实际上是+8吗?我敢打赌,Java 应用服务器的语言环境将会话时区设置为 GMT。 -
所以它是关于 Java 会话时区的。我在 Windows 上使用 tomcat 7。我不知道在 catalina.bat 的哪里添加
-Duser.timezone=GMT+08。 -
我搜索了很多,但没有一个有效。在
TO_DATE('19700101','yyyymmdd') + 1413360712/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24, ?)中,sessiontimezone 不起作用。我认为它在oracle上运行,我不明白为什么。最后我添加了8/24,这不是一个好的解决方案。谢谢@JustinCave
标签: java sql oracle unix timestamp