sql – CONVERT十进制DAYS到TIME格式

你好,我是一个sql的新手,我需要你的帮助.

我有下表:

    start_date      |     end_date          
02.08.2012 09:27:19 |  06.08.2012 07:53:00  
06.08.2012 06:58:58 |  06.08.2012 13:42:33
05.06.2012 14:35:58 |  05.06.2012 14:42:31

我需要显示start_date和end_date之间的持续时间.

我是这样做的:end_date – start_date = duration
但它显示一个十进制值(见下表 – 字段持续时间).

我需要字段持续时间显示如下:HH:MM:SS – 不是小数.

    start_date      |     end_date         |         duration        | I need it like this
02.08.2012 09:27:19 |  06.08.2012 07:53:00 | --> 3.93450231481481    |    94:25:41
06.08.2012 06:58:58 |  06.08.2012 13:42:33 | --> 0.280266203703704   |    06:43:35
05.06.2012 14:35:58 |  05.06.2012 14:42:31 | --> 0.0045486111111...  |    00:06:33

如果事情不确定,我会尝试解释.
我希望你能帮助我.祝你今天愉快.

最佳答案 减去日期会给出天数.您可以使用
NumToDSInterval功能将它们转换为INTERVAL DAY TO SECOND值.

随着开始日期02.08.2012 09:27:19和结束日期06.08.2012 07:53:00,结果是关闭但不完全你想要的(并注意浮动型圆形的东西41秒变成40.9999999 … ):

SQL> SELECT NumToDSInterval(
  2    TO_DATE('06.08.2012 07:53:00', 'DD.MM.YYYY HH24:MI:SS') -
  3    TO_DATE('02.08.2012 09:27:19', 'DD.MM.YYYY HH24:MI:SS'), 'DAY') AS Elapsed
  4  FROM DUAL;

ELAPSED
-----------------------------
+000000003 22:25:40.999999999

但这是一个很好的起点,因为一旦经过的时间处于INTERVAL类型,你可以EXTRACT天,小时,分钟和秒.我会做这样的事情:

WITH spans AS (
  SELECT NUMTODSINTERVAL(end_date - start_date, 'DAY') AS Elapsed
  FROM myTable
)
SELECT
  EXTRACT(DAY FROM Elapsed) * 24 + EXTRACT(HOUR FROM Elapsed) || ':' ||
  EXTRACT(MINUTE FROM Elapsed) || ':' ||
  ROUND(EXTRACT(SECOND FROM Elapsed), 0) AS duration
FROM spans

我用你的第一套日期尝试了这个,它运作得很好; ROUND使得秒数正确地显示为41.

附录OP需要在视图中使用此逻辑,并且我非常确定CTE(公用表表达式,否则称为“WITH foo AS(查询)”)将不会为视图飞行.

要在视图中使用它,请将CTE移动到子查询:

CREATE OR REPLACE VIEW myView AS
  SELECT
    EXTRACT(DAY FROM Elapsed) * 24 + EXTRACT(HOUR FROM Elapsed) || ':' ||
    EXTRACT(MINUTE FROM Elapsed) || ':' ||
    ROUND(EXTRACT(SECOND FROM Elapsed), 0) AS duration
  FROM (
    SELECT NUMTODSINTERVAL(end_date - start_date, 'DAY') AS Elapsed
    FROM myTable
  )
点赞