Reputation: 1120
I have an Oracle query I am working on and one of the columns returns the number of days represented in decimal where 1 day = 1.0
I have numbers like this:
0.004722222222222222222222222222222222222223
3.12383101851851851851851851851851851851
0.000856481481481481481481481481481481481479
0.002592592592592592592592592592592592592593
0.001041666666666666666666666666666666666667
and I want the number of hours and minutes each of those represent. Like 16 Hours 5 Minutes or 8 hours 59 Minutes.
How do I do that? Preferably as a single column return as the string.
Upvotes: 0
Views: 956
Reputation: 168671
Oracle Setup:
CREATE TABLE table_name ( value ) AS
SELECT 0.004722222222222222222222222222222222222223 FROM DUAL UNION ALL
SELECT 3.12383101851851851851851851851851851851 FROM DUAL UNION ALL
SELECT 0.000856481481481481481481481481481481481479 FROM DUAL UNION ALL
SELECT 0.002592592592592592592592592592592592592593 FROM DUAL UNION ALL
SELECT 0.001041666666666666666666666666666666666667 FROM DUAL;
Query:
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
Output:
NUMTODSINTERVAL(VALUE,'DAY')
----------------------------
0 0:6:48.0
3 2:58:19.0
0 0:1:14.0
0 0:3:44.0
0 0:1:30.0
Query 2:
SELECT TRIM( BOTH FROM
CASE WHEN dd <> 0 THEN dd || ' Days' END
|| CASE WHEN hh <> 0 THEN ' ' || hh || ' Hours' END
|| CASE WHEN mm <> 0 THEN ' ' || mm || ' Minutes' END
|| CASE WHEN ss <> 0 THEN ' ' || ss || ' Seconds' END
) AS period
FROM (
SELECT EXTRACT( DAY FROM period ) AS dd,
EXTRACT( HOUR FROM period ) AS hh,
EXTRACT( MINUTE FROM period ) AS mm,
EXTRACT( SECOND FROM period ) AS ss
FROM (
SELECT NUMTODSINTERVAL( value, 'DAY' ) AS period
FROM table_name
)
);
Output:
PERIOD
------------------------------------
6 Minutes 48 Seconds
3 Days 2 Hours 58 Minutes 19 Seconds
1 Minutes 14 Seconds
3 Minutes 44 Seconds
1 Minutes 30 Seconds
Upvotes: 1
Reputation: 5809
You can convert the decimal into interval and then extract the elements you want:
WITH data (value) AS (
SELECT 0.004722222222222222222222222222222222222223 FROM DUAL UNION ALL
SELECT 3.12383101851851851851851851851851851851 FROM DUAL UNION ALL
SELECT 0.000856481481481481481481481481481481481479 FROM DUAL UNION ALL
SELECT 0.002592592592592592592592592592592592592593 FROM DUAL UNION ALL
SELECT 0.001041666666666666666666666666666666666667 FROM DUAL),
intervals (value) AS (
SELECT numtodsinterval(value, 'DAY') interval FROM data)
SELECT
extract(DAY FROM value) day,
extract(HOUR FROM value) hour,
extract(MINUTE FROM value) minute,
extract(SECOND FROM value) second
FROM
intervals
Upvotes: 1