你好,我是一个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
如果有什么不确定的话,我会尝试解释。 我希望你能帮助我。祝你有愉快的一天。
答案 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')
不理想,但很快。