【问题标题】:How do I convert between org.hibernate.type.TimestampType and Oracle SYSDATE?如何在 org.hibernate.type.TimestampType 和 Oracle SYSDATE 之间进行转换?
【发布时间】:2020-05-15 08:35:57
【问题描述】:

我有一个使用org.hibernate.type.TimestampType 在休眠中映射的列。如何使用原生 Oracle SQL 根据 Oracle TIMESTAMP 存储和检索这些值?

该列映射为NUMBER(10)。我尝试使用我为 Unix 时间戳找到的一些公式,但它们似乎没有产生正确的结果。

这是最近的时间戳: 1579730473525 这应该是过去 2-3 周(2020 年 1 月)内的某个日期。

详情

我想通过 ValidityAuditStrategy 使用 Hibernate Envers。我遇到了麻烦,因为我将 Envers 应用于没有审计历史记录的现有记录的数据库。我正在尝试做的是一次性插入审计数据,使用 Oracle SYSDATE 作为时间戳。

【问题讨论】:

  • 为什么是列号(10)而不是实际的时间戳类型?
  • @OldProgrammer:我不知道答案。这部分模式是由 Hibernate Envers 生成的。

标签: java oracle hibernate hibernate-envers


【解决方案1】:

我不确定你的号码 1579730473525 是什么格式,所以我猜测了一下,使用 SUBSTR 取了前 10 位数字,结果是一个合理的 2020 年日期,如下所示。

SELECT TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') FROM dual;

返回

22/01/2020 22:01:13              

然后为了得到TIMESTAMP,我添加了最后4位。

SELECT to_char(TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') ,'YYYY-MM-DD hh:mm:ss') ||'.'||SUBSTR('1579730473525',10,4)
FROM dual;

这会返回:

2020-01-22 10:01:13.3525         

(我找不到将 14 位数字直接转换回 YYYY-MM-DD hh:mm:ss:ff 格式的方法;它抱怨精度)

然后把号码变成TIMESTAMP格式:

SELECT TO_TIMESTAMP(TO_CHAR(TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') ,'YYYY-MM-DD hh:mi:ss') ||'.'||SUBSTR('1579730473525',10,4),'YYYY-MM-DD hh:mi:ss:ff')
FROM dual;

这会根据要求使用 Oracle SQL 在 Oracle TIMESTAMP 中返回它。

提示:如果您遗漏了格式,请记下您的 NLS 参数 NLS_TIMESTAMP_FORMAT,以防遇到格式问题。

【讨论】:

  • 这可能比这更容易:to_timestamp_tz('01-JAN-1970 00:00:00 +0:00','DD-MON-YYYY HH24:MI:SS TZH:TZM') + numtodsinterval(1579730473525/1000,'SECOND')
  • 谢谢!我现在正在验证这一点
  • 完美!看起来我可以使用这种丑陋的方法将时间戳转换回数字:stackoverflow.com/questions/5063214/convert-interval-to-minutes 非常感谢你们俩。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2013-02-15
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
相关资源
最近更新 更多