Number to HH24:MM conversion - SQL,Oracle

问题描述:

我们有像810 1015这样的数字对,表示小时和分钟。我们必须计算这一对的微小差异。上面的例子会给125(分钟)。Number to HH24:MM conversion - SQL,Oracle

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

在此先感谢。

+1

是3位数的最小长度或者你可以有85 8:05 AM?因为在后一种情况下,你会遇到一个问题,因为125可以代表1:25和12:05 –

+1

难道你不能只用'lpad'加零来使其长度为4?然后做任何你打算用它做的事情。 – Plirkee

+1

问题不是3位数字是最小长度,但如果最后两位数字总是代表分钟。所以,比如说,105 - 是10:05还是1:05? [编辑]你如何表示00:20? –

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

谢谢! lpad是失踪的一块。 –

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

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

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 

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

+0

嗨!我们准备好了数据库,充满了记录,所以任务就是改变它,并且必须将它转换为日期(你想象的方式)。 –