2016-10-09 3 views
0
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 

合計時間を合計する必要があるため、NVLからNUMTODSINTERVALに変換して '00:00:00'に変換する必要があります。ただし、値がNULLの場合、結果はすべてNULLです。これを行うにはどうしたらいいですか?NUMTODSINTERVALへのNVLの実行方法

答えて

0

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

彼らは異なるデータ型であるため、 time1はタイムスタンプで、固定値は間隔です。

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

を...それは@sagiが提案何本質的である - だけではなく、変換後の文字列リテラルのタイムスタンプを持つ:あなたは代わりにリテラルタイムスタンプを使用することができます。日付部分は、時間が深夜である限り、何でもかまいません。

また、わずかな変形を使用することもできます。

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 

し、null値を持つ:

-nullでない値を提供するために、CTEと

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 

クイックデモ:あなただけゼロにする時間/分の数を必要とするので、

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 
2

time1の各発生を置き換えます:あなたはあなたが提案し何を行うことはできません

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

Upvoted、彼は彼が1年目で働きたいとは思っていません。 –

+0

私のために働きませんでした:( –

+0

私はこのようなものを使うと考えていました:NVL(time1、TO_DSINTERVAL( '0 00:00:00 '))....しかし、やった私のために働かない。 –

関連する問題