java - 如何在 org.hibernate.type.TimestampType 和 Oracle SYSDATE 之间进行转换?
问题描述
我有一列在休眠中使用org.hibernate.type.TimestampType
. 如何使用本机 Oracle SQL 基于 Oracle 存储和检索这些值TIMESTAMP
?
该列映射为NUMBER(10)
。我尝试使用我为 Unix 时间戳找到的一些公式,但它们似乎没有产生正确的结果。
这是最近的时间戳:
1579730473525
这将是过去 2-3 周(2020 年 1 月)内的某个日期。
细节
我想将 Hibernate Envers 与ValidityAuditStrategy
. 我遇到了麻烦,因为我将 Envers 应用于没有审计历史记录的现有记录的数据库。我想要做的是一次性插入审计数据,使用 OracleSYSDATE
作为时间戳。
解决方案
我不确定你的号码 1579730473525 是什么格式,所以我猜测了一下,用 a 取了前 10 位数字SUBSTR
,结果是一个合理的 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;
TIMESTAMP
这将使用 Oracle SQL 根据要求在 Oracle 中返回它。
只是一个提示:如果您遗漏了格式,请记下您的 NLS 参数 NLS_TIMESTAMP_FORMAT 以防遇到格式问题。
推荐阅读
- c# - MVC 提交按钮始终在 POST 上提交第一条记录详细信息
- list - 尝试创建另一个呼叫时出现问题?与一个值在列表中出现的次数有关的调用
- proof - 证明 L = {a^nb^m | n>=m} 是不规则语言
- c++ - OpenMP 行为 - 嵌套多线程
- python - 如何在 Python 3 中显示和选择函数?
- python-3.x - Docker 错误:找不到满足要求 tensorflow-cpu 的版本
- android - RecyclerView 一次加载所有项目,导致 Application Not Responding 错误
- php - 使用数据代码点火器 4 路由/重定向到同一控制器的索引
- python - 使用python将十进制数据写入avro的问题
- c# - 鼠标悬停在 C# 上时,我无法获得图像的正确坐标