如何更易读地呈现 ISO 8601 时间字符串
How to present an ISO 8601 time string more readably
我有一个名为“lag_time”的 Oracle 12c 数据库列,它是 VARCHAR2,具有以下格式的值:
lag_time
PT2H16M33S
PT11H40M12S
PT11M33S
P17DT12H32M47S
P233DT11H21M54S
PT10M28S
....
....
我需要一些关于如何以更具可读性的方式呈现它的建议和解决方案 - 最好是总分钟数。我该怎么做?
您可以使用 the to_dsinterval()
function 将字符串转换为间隔:
to_dsinterval(lag_time)
然后你可以提取各种元素,将它们中的每一个相乘得到等效的分钟值,然后将它们相加;完整分钟数:
select lag_time, lag_interval,
(extract(day from lag_interval) * 1440)
+ (extract(hour from lag_interval) * 24)
+ extract(minute from lag_interval) as total_minutes
from (
select lag_time, to_dsinterval(lag_time) as lag_interval
from your_table
)
LAG_TIME
LAG_INTERVAL
TOTAL_MINUTES
PT2H16M33S
+000000000 02:16:33.000000000
64
PT11H40M12S
+000000000 11:40:12.000000000
304
PT11M33S
+000000000 00:11:33.000000000
11
P17DT12H32M47S
+000000017 12:32:47.000000000
24800
P233DT11H21M54S
+000000233 11:21:54.000000000
335805
PT10M28S
+000000000 00:10:28.000000000
10
或包含小数分钟:
select lag_time, lag_interval,
(extract(day from lag_interval) * 1440)
+ (extract(hour from lag_interval) * 24)
+ extract(minute from lag_interval)
+ (extract(second from lag_interval) / 60) as total_minutes
from (
select lag_time, to_dsinterval(lag_time) as lag_interval
from your_table
)
LAG_TIME
LAG_INTERVAL
TOTAL_MINUTES
PT2H16M33S
+000000000 02:16:33.000000000
64.55
PT11H40M12S
+000000000 11:40:12.000000000
304.2
PT11M33S
+000000000 00:11:33.000000000
11.55
P17DT12H32M47S
+000000017 12:32:47.000000000
24800.78333333333333
P233DT11H21M54S
+000000233 11:21:54.000000000
335805.9
PT10M28S
+000000000 00:10:28.000000000
10.466666666666666667
当然,由于您存储的是字符串,因此不一定具有有效值;如果需要,您可以使用 default ... on conversion error
子句来处理它,但最好存储一个实际的间隔值。如果您确实需要字符串值,您还可以向 table 添加一个虚拟列,将其转换为间隔。
列名向我暗示,您将永远只有正值;您需要做更多的工作才能正确处理负值。
我有一个名为“lag_time”的 Oracle 12c 数据库列,它是 VARCHAR2,具有以下格式的值:
lag_time |
---|
PT2H16M33S |
PT11H40M12S |
PT11M33S |
P17DT12H32M47S |
P233DT11H21M54S |
PT10M28S |
.... |
.... |
我需要一些关于如何以更具可读性的方式呈现它的建议和解决方案 - 最好是总分钟数。我该怎么做?
您可以使用 the to_dsinterval()
function 将字符串转换为间隔:
to_dsinterval(lag_time)
然后你可以提取各种元素,将它们中的每一个相乘得到等效的分钟值,然后将它们相加;完整分钟数:
select lag_time, lag_interval,
(extract(day from lag_interval) * 1440)
+ (extract(hour from lag_interval) * 24)
+ extract(minute from lag_interval) as total_minutes
from (
select lag_time, to_dsinterval(lag_time) as lag_interval
from your_table
)
LAG_TIME | LAG_INTERVAL | TOTAL_MINUTES |
---|---|---|
PT2H16M33S | +000000000 02:16:33.000000000 | 64 |
PT11H40M12S | +000000000 11:40:12.000000000 | 304 |
PT11M33S | +000000000 00:11:33.000000000 | 11 |
P17DT12H32M47S | +000000017 12:32:47.000000000 | 24800 |
P233DT11H21M54S | +000000233 11:21:54.000000000 | 335805 |
PT10M28S | +000000000 00:10:28.000000000 | 10 |
或包含小数分钟:
select lag_time, lag_interval,
(extract(day from lag_interval) * 1440)
+ (extract(hour from lag_interval) * 24)
+ extract(minute from lag_interval)
+ (extract(second from lag_interval) / 60) as total_minutes
from (
select lag_time, to_dsinterval(lag_time) as lag_interval
from your_table
)
LAG_TIME | LAG_INTERVAL | TOTAL_MINUTES |
---|---|---|
PT2H16M33S | +000000000 02:16:33.000000000 | 64.55 |
PT11H40M12S | +000000000 11:40:12.000000000 | 304.2 |
PT11M33S | +000000000 00:11:33.000000000 | 11.55 |
P17DT12H32M47S | +000000017 12:32:47.000000000 | 24800.78333333333333 |
P233DT11H21M54S | +000000233 11:21:54.000000000 | 335805.9 |
PT10M28S | +000000000 00:10:28.000000000 | 10.466666666666666667 |
当然,由于您存储的是字符串,因此不一定具有有效值;如果需要,您可以使用 default ... on conversion error
子句来处理它,但最好存储一个实际的间隔值。如果您确实需要字符串值,您还可以向 table 添加一个虚拟列,将其转换为间隔。
列名向我暗示,您将永远只有正值;您需要做更多的工作才能正确处理负值。