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

时间:2017-03-09 12:13:38

标签: sql plsql oracle10g sql-function

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

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

提前致谢。

4 个答案:

答案 0 :(得分:2)

编辑:此解决方案基于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;

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

假设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得到分钟

答案 3 :(得分:0)

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

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;