【问题标题】:Converting INTERVAL DAY TO SECOND将 INTERVAL DAY 转换为 SECOND
【发布时间】:2018-01-25 21:53:47
【问题描述】:

我想使用区间数据类型获得更具可读性的值。

select cast(last_run_duration as INTERVAL DAY TO SECOND(0))
from dba_scheduler_jobs
order by 1 desc;

这样的查询结果;

+00 00:00:04.630530
+00 00:00:01.352359
+00 00:00:00.737282
+00 00:00:00.594381
+00 00:00:00.432710

我想要的是这个。只得到 Hour:minute:second ;

 00:00:04
 00:00:01
 00:00:00
 00:00:00
 00:00:00

last_run_duration 列的数据类型是INTERVAL DAY(9) TO SECOND(6)

【问题讨论】:

  • 可能不是完全相同的副本,但the second half of this answer 显示了一些选项。
  • 看起来你想要hour to second(0)
  • @jarlh cast(last_run_duration as interval hour to second(0) 给了我 ORA-00963: unsupported interval type in 12.1.0.2.0.
  • 您的查询为我提供了 SQL*Plus(Oracle 12.1.0.2.0,客户端 11.2.0.2.0)中的 +00 01:26:24 之类的值。转换为 INTERVAL DAY(0) TO SECOND(0)) 会丢失前导零之一。要剥离那些你可以使用substr,如果你知道它永远不会超过一天。如果你想要像36:12:34 这样的东西,那就更棘手了。在你的情况下这可能吗?

标签: sql oracle


【解决方案1】:

INTERAVL DAY TO SECOND 有固定的输出格式,TO_CHAR 不起作用。

按照 Edumelzer 的建议,使用 EXTRACT

select lpad(extract(hour from last_run_duration),2,'0')||':'||
       lpad(extract(minute from last_run_duration),2,'0')||':'||
       lpad(round(extract(second from last_run_duration)),2,'0') as duration
  from dba_scheduler_jobs
 order by 1 desc;

或使用类似的子字符串

select 
REGEXP_SUBSTR(last_run_duration, '\d{2}:\d{2}:\d{2}')
from from dba_scheduler_jobs;

【讨论】:

    【解决方案2】:

    尝试使用extract

    select lpad(extract(hour from last_run_duration),2,'0')||':'||
           lpad(extract(minute from last_run_duration),2,'0')||':'||
           lpad(round(extract(second from last_run_duration)),2,'0') as duration
      from dba_scheduler_jobs
     order by 1 desc;
    

    【讨论】:

    • 如果 day 组件可能 > 0,您还可以提取 day,乘以 24 并添加到 hour,得到 1.5 天作为 36:00:00。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2014-03-09
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多