【问题标题】:Insert subquery inside INTERVAL Oracle在 INTERVAL Oracle 中插入子查询
【发布时间】:2016-06-24 08:24:54
【问题描述】:

这项工作很好:

SELECT INTERVAL '1:0:0' HOUR TO SECOND FROM   dual;

我正在尝试从表中选择一些值并将其用作 INTERVAL。如何使用子查询而不是 '1:0:0'?

SELECT INTERVAL (SELECT some_varchar_value from some_table) HOUR TO SECOND FROM DUAL;

但 INTERVAL 需要在单引号 ' ' 内表达

【问题讨论】:

  • 表格的值是多少?
  • 格式可以是 0:0:1 或 00:00:01、9:9:9 或 99:59:59
  • 可以超过24小时?
  • 是的,它可以超过 24 小时,但它以小时而不是天的形式保存
  • 好的,更新我的答案来处理这个问题

标签: sql oracle subquery intervals


【解决方案1】:

你可以使用the TO_DSINTERVAL() function:

SELECT TO_DSINTERVAL(some_varchar_value)
FROM some_table;

但是您的字符串值需要采用正确的格式。如果如图所示,只有小时、分钟和秒,您需要在天数前面加上一个虚拟零:

with some_table(some_varchar_value) as (
  select '1:0:0' from dual
)
SELECT TO_DSINTERVAL('0 ' || some_varchar_value)
FROM some_table;

TO_DSINTERV
-----------
0 1:0:0.0  

如果您的小时值可以大于 24,那么您需要将其拆分为整天和剩余小时数:

with some_table(some_varchar_value) as (
  select '1:2:3' from dual
  union all select '99:45:15' from dual
)
SELECT TO_DSINTERVAL(
    floor(to_number(regexp_substr(some_varchar_value, '[^:]+', 1, 1)) / 24)
    || ' ' || mod(to_number(regexp_substr(some_varchar_value, '[^:]+', 1, 1)), 24)
    || ':' || regexp_substr(some_varchar_value, '[^:]+', 1, 2)
    || ':' || regexp_substr(some_varchar_value, '[^:]+', 1, 3)
  )
FROM some_table;

TO_DSINTERV
-----------
0 1:2:3.0  
4 3:45:15.0

其内部是将原始字符串拆分为单独的小时、分钟和秒部分;然后用floor(hours / 24) 将小时分成几天,用mod(hours, 24) 将剩余的小时分成几天。您可以通过以下方式更清楚地看到这一点:

with some_table(some_varchar_value) as (
  select '99:59:30' from dual
)
SELECT regexp_substr(some_varchar_value, '[^:]+', 1, 1), regexp_substr(some_varchar_value, '[^:]+', 1, 2), regexp_substr(some_varchar_value, '[^:]+', 1, 3)
FROM some_table;

with some_table(some_varchar_value) as (
  select '1:2:3' from dual
  union all select '99:45:15' from dual
)
SELECT regexp_substr(some_varchar_value, '[^:]+', 1, 1) as raw_hh,
  regexp_substr(some_varchar_value, '[^:]+', 1, 2) as raw_mi,
  regexp_substr(some_varchar_value, '[^:]+', 1, 3) as raw_ss,
  floor(to_number(regexp_substr(some_varchar_value, '[^:]+', 1, 1)) / 24) as new_dd,
  mod(to_number(regexp_substr(some_varchar_value, '[^:]+', 1, 1)), 24) as new_hh
FROM some_table;

RAW_HH   RAW_MI   RAW_SS       NEW_DD     NEW_HH
-------- -------- -------- ---------- ----------
1        2        3                 0          1
99       45       15                4          3

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2012-09-26
    • 2016-02-08
    相关资源
    最近更新 更多