您好,我是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
如果不确定,我会尽力解释。我希望你能帮助我。祝你有美好的一天。
日期减去后得到的天数。您可以使用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
我注意到您想要的时间超过一天。以下内容为您提供了几天,几小时,几分钟,几秒钟,最多可以运行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
)
不理想,但是很快。
我认为您需要使用内置的oracle函数。试试看这里的日期SUBto_char()
这将使您可以设置返回时间的精度。