CONVERT十进制DAYS到TIME格式

时间:2013-07-16 21:06:11

标签: sql oracle time format hour

你好,我是一个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

如果有什么不确定的话,我会尝试解释。 我希望你能帮助我。祝你有愉快的一天。

3 个答案:

答案 0 :(得分:2)

日期的减去会给出天数。您可以使用NumToDSInterval函数将它们转换为INTERVAL DAY TO SECOND值。

使用开始日期02.08.2012 09:27:19和结束日期06.08.2012 07:53:00,结果很接近但不完全符合您的要求(并注意浮动类型的舍入事项,其中41秒变为40.9999999 ...):< / p>

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
  )

答案 1 :(得分:0)

我认为你需要使用内置的oracle函数。尝试日期SUB,如此处所示 Oracle Docs / MySQL

这将允许您设置返回时间的精度。

答案 2 :(得分:0)

我注意到你想要超过一天的时间。以下内容为您提供日,小时,分钟,秒和最多31天的工作时间。我们的想法是将其转换为日期,然后使用to_char()进行转换:

select to_char(cast('01-Jan-2000' as date) + duration,
               'dd hh:mm:ss')

不理想,但很快。