如何在org.hibernate.type.TimestampType和Oracle SYSDATE之间进行转换?



我有一列使用org.hibernate.type.TimestampType在休眠中映射。如何使用本机Oracle SQL基于OracleTIMESTAMP存储和检索这些值?

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

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

我想使用休眠恩弗斯,与ValidityAuditStrategy.我遇到了麻烦,因为我正在将 Envers 应用于没有审核历史记录的现有记录数据库。我正在尝试做的是一次性插入审计数据,使用 OracleSYSDATE作为时间戳。

我不确定你的号码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 将其返回到 OracleTIMESTAMP中。

只是一个提示:如果您省略了格式,请记下您的 NLS 参数NLS_TIMESTAMP_FORMAT以防您遇到格式问题。

相关内容

  • 没有找到相关文章

最新更新