你好,我是一个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
如果事情不确定,我会尝试解释.
我希望你能帮助我.祝你今天愉快.
最佳答案 减去日期会给出天数.您可以使用
NumToDSInterval
功能将它们转换为INTERVAL DAY TO SECOND值.
随着开始日期02.08.2012 09:27:19和结束日期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
)