oracle使用tou date检查项目是否在最后一小时内

jm2pwxwz  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(317)

我有一个我正在尝试使用的查询 TO_DATE 检查是否 ERROR_DT 是一个在当前时间一小时内的数据,这是我到目前为止得到的

SELECT BERROR_DT FROM SomeTable
WHERE ERROR_DT>=TO_CHAR(TO_DATE( SYSDATE, 'MM/DD/YYYY HH12:MI:SS AM') -1, 'fmMM/DDfm/YYYY HH12:MI:SS AM');
``` `Error_DT` 值(例如) `5/18/2020 6:45:15 PM` 当我运行这个时

ORA-01830: date format picture ends before converting entire input string

我遵循了上述链接,但它仍然不起作用。如何修复此问题,以便仍然可以删除月份和日期前的所有0?
nnt7mjpx

nnt7mjpx1#

我建议将日期字符串转换为相应的 date 值,然后进行比较:

select berror_dt
from sometable
where to_date(error_dt, 'fmMM/DD/YYYY HH12:MI:SS AM') >= sysdate - interval '1' hour

总之,您应该修复数据模型,并将日期存储为类似日期的数据类型,而不是字符串。上面的 predicate 是无效的,因为转换需要为的每个值执行 error_dt 在应用筛选之前,因此会破坏列上的现有索引。

doinxwow

doinxwow2#

显然你做的不对的事就是申请 TO_DATESYSDATE 这是一个返回 DATE 数据类型。
你能做的就是减法 sysdate 以及 error_dt (我假设它的数据类型是 DATE 以及)并查看差异是否小于1小时。因为两个日期的差值是天数,所以必须将其除以24(因为一天有24小时)。
像这样:

SQL> alter session set nls_date_format = ' dd.mm.yyyy hh:mi:ss am';

Session altered.

SQL> with test (id, error_dt) as
  2    (select 1, to_date('18.05.2020 10:30:15 PM', 'dd.mm.yyyy hh:mi:ss am') from dual
  3     union all
  4     select 2, to_date('18.05.2020 05:20:55 AM', 'dd.mm.yyyy hh:mi:ss am') from dual)
  5  select t.id, t.error_dt, sysdate
  6  from test t
  7  where sysdate - t.error_dt < 1 / 24;

        ID ERROR_DT                SYSDATE
---------- ----------------------- -----------------------
         1  18.05.2020 10:30:15 PM  18.05.2020 11:02:24 PM

SQL>
az31mfrm

az31mfrm3#

如果error\u dt是一个日期值,您只需要使用

SELECT BERROR_DT
  FROM SomeTable
  WHERE ERROR_DT >= SYSDATE - INTERVAL '1' HOUR

或者如果你更喜欢使用老式的间隔前计算

SELECT BERROR_DT
  FROM SomeTable
  WHERE ERROR_DT >= SYSDATE - (1/24)

相关问题