繁体   English   中英

Oracle SQL中java.sql.Timestamp到日期的转换

[英]java.sql.Timestamp to Date Conversion in Oracle SQL

我在Oracle SQL中遇到了这个奇怪的时间戳到日期转换问题。

这是SQL语句:

String INSERT_SQL = String.format("INSERT INTO AUDIT_TASK (%s, %s, %s, %s) VALUES (AUDIT_TASK_SEQ.nextval,?,?,?)",ID,CLASS_NAME,TASK_STEP_TIMESTAMP,OPERATOR);

java.util.Calendar utcCalendarInstance = Calendar.getInstance(TimeZone .getTimeZone("UTC"));
java.util.Calendar cal = Calendar.getInstance();
final PreparedStatement stmt = con.prepareStatement(INSERT_SQL);
stmt.setString(1, audit.getClassName().getValue());
// Save the timestamp in UTC
stmt.setTimestamp(2,new Timestamp(cal.getTimeInMillis()), utcCalendarInstance);

当我执行此语句时,虽然大多数情况下creation_date和task_step_timestamp日期是相同的,但是有时我会生成带有某些假日期的task_step_timestamp,例如'25 -APR-0000'或'00 -Jan-0001'等。

  • ID | 创建日期| Task_step_timestamp
  • 1 | 27-APR-2018 17:58:53 | 25-APR-0000 09:00:45
  • 2 | 27-APR-2018 18:06:25 | 00-一月-0001 09:18:25

Oracle DB中task_step_timestamp列的数据类型为“ DATE”。

有人可以建议将时间戳转换为日期不一致的原因吗?

我不明白您为什么在这里使用String#format 只需使用提及显式列的常规插入:

String INSERT_SQL = "INSERT INTO AUDIT_TASK (ID, ERROR_MESSAGE, TASK_STEP_TIMESTAMP, OPERATOR) ";
INSERT_SQL += "VALUES (AUDIT_TASK_SEQ.nextval, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(INSERT_SQL);

然后绑定您的值:

stmt.setString(1, audit.getErrorMessage() != null ? audit.getErrorMessage().getValue() : null);
stmt.setTimestamp(2, new Timestamp(cal.getTimeInMillis()), utcCalendarInstance);
stmt.setString(3, audit.getClassName().getValue());

请注意,从左到右的顺序,占位符用于错误消息,任务步骤时间戳和运算符。 您的原始代码似乎绑定了无序的参数。 通过使用显式提及列的插入语句,可以避免此问题。

编辑:

对于您来说,为什么要担心时间戳的时区,这对我也没有意义。 只需获取自纪元以来的毫秒数,然后让数据库将其存储为UTC:

Timestamp timestamp = new Timestamp(System.currentTimeMillis());
stmt.setTimestamp(2, timestamp);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM