5

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

如果有什么不确定的,我会试着解释。我希望你能帮助我。祝你今天过得愉快。

4

3 回答 3

3

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

使用 start date02.08.2012 09:27:19和 end date 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
  )
于 2013-07-16T21:39:13.973 回答
1

我注意到你想要超过一天的时间。以下为您提供天、小时、分钟、秒和最长 31 天的工作时间。这个想法是将其转换为日期,然后to_char()用于转换:

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

不理想,但很快。

于 2013-07-16T21:40:22.080 回答
0

我认为您需要使用内置的 oracle 函数。试试看这里的 Date SUB Oracle Docs / MySQL

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

于 2013-07-16T21:10:18.767 回答