如何将NVL转换为NUMTODSINTERVAL

时间:2016-10-09 07:06:21

标签: sql oracle

SELECT NUMTODSINTERVAL(SUM(EXTRACT(HOUR FROM time1)), 'HOUR') +
   NUMTODSINTERVAL(SUM(EXTRACT(MINUTE FROM time1)), 'MINUTE') AS HOURS
   FROM table1 WHERE id1 = '123' AND value1 = 123

我需要对NUMTODSINTERVAL进行NVL并将其转换为' 0 00:00:00',因为我需要总计总时数。但是,当值为NULL时,结果都为NULL。我应该怎么做呢?

2 个答案:

答案 0 :(得分:2)

time1的每次出现替换为:

NVL(time1,to_date('01/01/0001 00:00:00','dd/mm/yyyy hh24:mi:ss'))

答案 1 :(得分:0)

你不能按照你的建议行事:

NVL(time1, TO_DSINTERVAL('0 00:00:00'))

因为它们是不同的数据类型; time1是时间戳,而固定值是间隔。您可以使用时间戳文字:

NVL(time1, TIMESTAMP '1972-01-01 00:00:00')

...但这基本上是@sagi建议的 - 只是使用时间戳文字而不是转换后的字符串。只要时间是午夜,日期部分并不重要,可以是任何事情。

您也可以使用轻微变体;因为你只需要小时/分钟数为零:

SELECT NUMTODSINTERVAL(SUM(NVL(EXTRACT(HOUR FROM time1), 0)), 'HOUR') +
   NUMTODSINTERVAL(SUM(NVL(EXTRACT(MINUTE FROM time1), 0)), 'MINUTE') AS HOURS
FROM table1 WHERE id1 = '123' AND value1 = 123

使用CTE进行快速演示以提供非空值:

WITH table1 (id1, value1, time1) AS (
   SELECT '123', 123, TIMESTAMP '2016-01-01 12:34:56.789'
   FROM dual
)
SELECT NUMTODSINTERVAL(SUM(NVL(EXTRACT(HOUR FROM time1), 0)), 'HOUR') +
   NUMTODSINTERVAL(SUM(NVL(EXTRACT(MINUTE FROM time1), 0)), 'MINUTE') AS HOURS
   FROM table1 WHERE id1 = '123' AND value1 = 123;

HOURS
-----------------------------
+000000000 12:34:00.000000000

并且值为空值:

WITH table1 (id1, value1, time1) AS (
   SELECT '123', 123, CAST(null AS TIMESTAMP)
   FROM dual
)
SELECT NUMTODSINTERVAL(SUM(NVL(EXTRACT(HOUR FROM time1), 0)), 'HOUR') +
   NUMTODSINTERVAL(SUM(NVL(EXTRACT(MINUTE FROM time1), 0)), 'MINUTE') AS HOURS
   FROM table1 WHERE id1 = '123' AND value1 = 123;

HOURS
-----------------------------
+000000000 00:00:00.000000000