在Oracle SQL中,如何将天数的十进制表示形式转换为小时数和分钟数?

在Oracle SQL中,如何将天数的十进制表示形式转换为小时数和分钟数?,oracle,date,Oracle,Date,我正在处理一个Oracle查询,其中一列返回以十进制表示的天数,其中1天=1.0 我有这样的数字: 0.004722222222222222222222222222222222222223 3.12383101851851851851851851851851851851 0.000856481481481481481481481481481481481479 0.002592592592592592592592592592592592592593 0.0010416666666666666666

我正在处理一个Oracle查询,其中一列返回以十进制表示的天数,其中1天=1.0

我有这样的数字:

0.004722222222222222222222222222222222222223
3.12383101851851851851851851851851851851
0.000856481481481481481481481481481481481479
0.002592592592592592592592592592592592592593
0.001041666666666666666666666666666666666667
我想知道它们各自代表的小时数和分钟数。比如16小时5分钟或者8小时59分钟


我该怎么做?最好是作为字符串返回的单列

您可以将小数转换为间隔,然后提取所需的元素:

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

您可以将小数转换为间隔,然后提取所需的元素:

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

Oracle安装程序

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
查询

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
输出

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
查询2

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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

Oracle安装程序

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
查询

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
输出

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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
查询2

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;
SELECT NUMTODSINTERVAL( value, 'DAY' ) FROM table_name;
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                   
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
  )
);
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