你可以使用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