如何在 Oracle SQL 中将时间戳转换为数字

问题描述 投票:0回答:1

我的时间戳如下 '01:54:45' 在一列中,我想将其更改为 int 或 bigint 例如 1809384,只是相同时间戳的随机数,即如果时间戳与 例如 中的时间戳相同,则应该将其转换正如我所提到的,转换为 bigint 。谁能帮我解决这个问题,我想计算工作流程在 2、3 天内完成所需的平均时间。随后,一旦我得到平均值,我想将其转换回给定的时间戳格式。例如,如果平均值是 728638,我希望将其转换回“01:03:23”。

我尝试了 to_number(to_char('01:54:45', 'HHMISS')) 但它不起作用。

sql oracle
1个回答
0
投票

对我来说,它看起来好像“时间戳”存储为代表

hours:minutes:seconds
的字符串。如果是这样,一种选择可能是

  • 通过提取它的每个部分并将其转换为秒并乘以适当的值
  • 一旦获得秒数,计算平均值(没关系,因为结果将代表平均秒数)
  • 将该值转换回秒、小时和分钟(再次应用适当的计算)
  • 最后,通过连接之前计算的值来组合结果

这是一个例子:

样本数据; 大约少了6分钟,多了2小时,这意味着最终结果应该是“2小时0分钟”和“(46 + 18) / 2 = 64 / 2 = 32秒”。

SQL> with
  2  test (col) as
  3    (select '01:54:46' from dual union all
  4     select '02:06:18' from dual
  5    ),

查询从这里开始:

  6  convert_to_number as
  7    (select col,
  8         to_number(regexp_substr(col, '\d+', 1, 1)) * 60 * 60 +
  9         to_number(regexp_substr(col, '\d+', 1, 2)) * 60 +
 10         to_number(regexp_substr(col, '\d+', 1, 3)) to_num
 11     from test
 12    ),
 13  calculate_average as
 14    (select avg(to_num) avg_tn
 15     from convert_to_number
 16    ),
 17  hms as
 18    (select avg_tn,
 19       avg_tn / (60 * 60) c_hour,
 20       --
 21       mod(avg_tn / (60 * 60), 1) * 60 c_min,
 22       --
 23       mod(mod(avg_tn / (60 * 60), 1) * 60, 1) * 60 c_sec
 24     from calculate_average
 25    )
 26  select lpad(trunc(c_hour), 2, '0') ||':'||
 27         lpad(trunc(c_min) , 2, '0') ||':'||
 28         lpad(trunc(c_sec)  , 2, '0') as result
 29  from hms;

RESULT
--------
02:00:32

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.