我们一直在调试从通过Hibernate运行Java的应用服务器执行的SQL查询的问题.错误:
[3/10/14 10:52:07:143 EDT] 0000a984 JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 1878, SQLState: 22008
[3/10/14 10:52:07:144 EDT] 0000a984 JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions ORA-01878: specified field not found in datetime or interval
Run Code Online (Sandbox Code Playgroud)
我们已经能够将其缩小到下面的简单SQL.
select *
from MY_TABLE T
where T.MY_TIMESTAMP >= (CURRENT_TIMESTAMP - interval '1' hour );
Run Code Online (Sandbox Code Playgroud)
当我们在同一个数据库中运行它时,我们得到错误:
ORA-01878: specified field not found in datetime or interval
01878. 00000 - "specified field not found in datetime or interval"
*Cause: The specified field was not found in the datetime or interval.
*Action: …Run Code Online (Sandbox Code Playgroud) 如何在Oracle中存储日期?例如,我知道大多数系统使用大纪元时间来确定它的时间.通过计算1970年1月1日之后的秒数.甲骨文也这样做了吗?
我问这个的原因是我注意到如果你在Oracle中使用两个日期并减去它们,你会得到一个浮点数,它们介于两者之间.
例
(Sysdate - dateColumn)
Run Code Online (Sandbox Code Playgroud)
会返回这样的东西(取决于时间)
3.32453703703703703703703703703703703704
Run Code Online (Sandbox Code Playgroud)
现在,Oracle正在进行转换和吐出格式化,或者Oracle存储日期与特定时间段之外的天数?(像大纪元一样)
我首先运行以下命令,并得到以下结果:
select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 10:21:40
Run Code Online (Sandbox Code Playgroud)
这是我想要存储TIMESTAMP对象的格式。
但是,当我将其转换回来时,它不是我想要的格式:
select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 10.21.40.000000000 AM
Run Code Online (Sandbox Code Playgroud)
实际上,将 2018 更改为末尾,将 07 设置为“JUL”,现在 10 位于最前面。时间也用点分隔,有很多 0 和一个 AM。
我怎样才能解决这个问题?我是 SQL 开发的新手,所以我不确定格式。
非常感谢