如何在 org.hibernate.type.TimestampType 和 Oracle SYSDATE 之间转换?
How do I convert between org.hibernate.type.TimestampType and Oracle SYSDATE?
我有一个使用 org.hibernate.type.TimestampType
在休眠中映射的列。我如何使用本机 Oracle SQL 存储和检索基于 Oracle TIMESTAMP
的这些值?
列映射为 NUMBER(10)
。我尝试使用我为 Unix 时间戳找到的一些公式,但它们似乎没有产生正确的结果。
这是最近的时间戳:
1579730473525
这应该是过去 2-3 周内的某个日期(2020 年 1 月)。
详情
我想使用 Hibernate Envers,配合 ValidityAuditStrategy
。我 运行 遇到了麻烦,因为我将 Envers 应用于没有审计历史记录的现有记录的数据库。我想做的是一次性插入审计数据,使用 Oracle SYSDATE
作为时间戳。
我不确定你的号码 1579730473525 是什么格式,所以我猜测并使用 SUBSTR
取前 10 位数字,结果是一个合理的 2020 年日期,如下所示。
SELECT TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') FROM dual;
returns
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;
和这个 returns:
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;
和这个 returns 它在 Oracle TIMESTAMP
中按要求使用 Oracle SQL.
提示:如果您遗漏了格式,请记下您的 NLS 参数 NLS_TIMESTAMP_FORMAT 以防出现格式问题。
我有一个使用 org.hibernate.type.TimestampType
在休眠中映射的列。我如何使用本机 Oracle SQL 存储和检索基于 Oracle TIMESTAMP
的这些值?
列映射为 NUMBER(10)
。我尝试使用我为 Unix 时间戳找到的一些公式,但它们似乎没有产生正确的结果。
这是最近的时间戳:
1579730473525
这应该是过去 2-3 周内的某个日期(2020 年 1 月)。
详情
我想使用 Hibernate Envers,配合 ValidityAuditStrategy
。我 运行 遇到了麻烦,因为我将 Envers 应用于没有审计历史记录的现有记录的数据库。我想做的是一次性插入审计数据,使用 Oracle SYSDATE
作为时间戳。
我不确定你的号码 1579730473525 是什么格式,所以我猜测并使用 SUBSTR
取前 10 位数字,结果是一个合理的 2020 年日期,如下所示。
SELECT TO_DATE('1970-01-01','YYYY-MM-DD') +
NUMTODSINTERVAL(TO_NUMBER(SUBSTR('1579730473525',1,10)), 'SECOND') FROM dual;
returns
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;
和这个 returns:
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;
和这个 returns 它在 Oracle TIMESTAMP
中按要求使用 Oracle SQL.
提示:如果您遗漏了格式,请记下您的 NLS 参数 NLS_TIMESTAMP_FORMAT 以防出现格式问题。