简体   繁体   中英

Number to HH24:MM conversion - SQL, Oracle

We have number pairs like 810 1015 that mean the hour and minute. We have to calculate the minute difference of the pair. The example above would give 125 (minutes).

What solution would you give? I thought about converting to string and substringing then concatenating, but can't know if it is 3 or 4 long and using IF ELSE but would be too complicated (if no other solution exist I am left with this). Also thought about somehow converting to base 60 and subtracting, but also too complicated.

Thanks in advance.

Edit: This solution is based on Plirkee's comment to lpad numbers to get 4-character strings, and on Stefano Zanini's solution modified to allow for 0 hour, and 24-hour format.

If last two digits always represent minutes, and if hours are always in 24-hour format:

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;

How about storing the data as a DATA datetype, using an standard date portion, such as 01-10-2000. So you data would be

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

Then you can just do simple date math :)

Assuming 3 digits is the minimum length of your numbers (otherwise you'd have ambiguous cases), this following query should do the trick

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)

The steps are:

  1. explode the numbers in two parts each: last two digits as the minutes and the remaining digits as the hour
  2. concatenate the two parts with a separator (in this example ':')
  3. convert that concatenations into dates
  4. multiply the difference between the two dates (which is in days) by 24 to get hours and by 60 to get minutes

Just an another tweak which can be used. Hope this helps.

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM