将十进制天转换为时间格式

问题描述 投票:5回答:3

您好,我是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

我需要显示开始日期和结束日期之间的持续时间。

我是这样的:结束日期-开始日期=持续时间但它显示一个十进制值(请参见下表-字段持续时间)。

我需要像这样显示的字段持续时间: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

如果不确定,我会尽力解释。我希望你能帮助我。祝你有美好的一天。

sql oracle time format hour
3个回答
3
投票

日期减去后得到的天数。您可以使用INTERVAL DAY TO SECOND功能将它们转换为NumToDSInterval值。

使用开始日期NumToDSInterval和结束日期02.08.2012 09:27:19,结果接近但不完全是您想要的(并且注意浮点型舍入,其中41秒变为40.9999999 ...):

06.08.2012 07:53:00

但是这是一个很好的起点,因为一旦经过时间为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

我尝试过使用您的第一组日期,但效果很好; EXTRACT使秒正确显示为41。


Addendum OP需要在视图中使用此逻辑,并且我很确定CTE(公用表表达式,否则称为“ WITH foo AS(查询)”)将不会用于视图。

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

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

1
投票

我注意到您想要的时间超过一天。以下内容为您提供了几天,几小时,几分钟,几秒钟,最多可以运行31天。想法是将其转换为日期,然后使用ROUND进行转换:

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
  )

不理想,但是很快。


0
投票

我认为您需要使用内置的oracle函数。试试看这里的日期SUBto_char()

这将使您可以设置返回时间的精度。

© www.soinside.com 2019 - 2024. All rights reserved.