我们有数字对,如810 1015,表示小时和分钟。我们必须计算这对的微小差异。上面的例子将给出125(分钟)。
你会给出什么样的解决方案?我考虑转换为字符串和子串,然后连接,但不知道它是3或4长并使用IF ELSE但是太复杂(如果没有其他解决方案存在我留下这个)。还想过以某种方式转换到基数60并减去,但也太复杂了。
提前致谢。
答案 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)
步骤如下:
答案 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;