数字到 HH24:MM 的转换 - SQL,Oracle

Number to HH24:MM conversion - SQL, Oracle

我们有像 810 1015 这样的数字对,表示小时和分钟。我们必须计算这对的微小差异。上面的示例将给出 125(分钟)。

你会给出什么解决方案?我考虑过转换为字符串和子字符串然后连接,但不知道它是 3 还是 4 长并且使用 IF ELSE 但会太复杂(如果不存在其他解决方案我就剩下这个了)。也想过以某种方式转换为base 60并减去,但也太复杂了。

提前致谢。

假设 3 位数字是您的数字的最小长度(否则您会遇到不明确的情况),下面的查询应该可以解决问题

select  (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
        to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from    (select 810 t1, 1015 t2 from dual)

步骤是:

  1. 将数字分别分成两部分:最后两位数字为分钟,其余数字为小时
  2. 用分隔符连接两个部分(在本例中为“:”)
  3. 将连接转换为日期
  4. 将两个日期(以天为单位)之间的差异乘以 24 得到小时数,乘以 60 得到分钟数

编辑:此解决方案基于 Plirkee 对 lpad 数字的评论以获取 4 个字符的字符串,并基于 Stefano Zanini 的解决方案修改为允许 0 小时和 24 小时格式。

如果最后两位数字始终表示分钟,并且如果小时始终采用 24 小时格式:

with t(time1, time2) as (
  select 810, 1015 from dual union all
  select 20, 1530 from dual
),
conv(time1, time2) as (
  select lpad(to_char(time1), 4, '0'),
         lpad(to_char(time2), 4, '0')
    from t
)
select time1,
       time2,
       24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes
  from conv;

只是另一个可以使用的调整。希望这有帮助。

SELECT 
TO_CHAR(TO_DATE(LPAD(LPAD('1015',4,'0') - LPAD('810',4,'0'),4,'0'),'HH24MI'),'HH24')*60
+TO_CHAR(TO_DATE(lpad(lpad('1015',4,'0') - lpad('810',4,'0'),4,'0'),'HH24MI'),'MI') MINUTES
FROM dual;

如何使用标准日期部分(例如 01-10-2000)将数据存储为 DATA 日期类型。所以你的数据将是

    01-01-2000 8:10:00
    01-01-2000 10:15:00
etc

然后你可以做简单的日期数学:)