如何更易读地呈现 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

db<>fiddle

当然,由于您存储的是字符串,因此不一定具有有效值;如果需要,您可以使用 default ... on conversion error 子句来处理它,但最好存储一个实际的间隔值。如果您确实需要字符串值,您还可以向 table 添加一个虚拟列,将其转换为间隔。

列名向我暗示,您将永远只有正值;您需要做更多的工作才能正确处理负值。