2016-10-09 1 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 

Ich muss eine NVL zu NUMTODSINTERVAL machen und es in '0 00:00:00' umwandeln, weil ich die Gesamtstunden zusammenfassen muss. Wenn ein Wert jedoch NULL ist, sind die Ergebnisse alle NULL. Wie soll ich das machen?Wie man eine NVL zu NUMTODSINTERVAL macht

Antwort

0

Sie nicht tun können, was Sie vorgeschlagen:

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

, weil sie unterschiedliche Datentypen sind; time1 ist ein Zeitstempel, während der feste Wert ein Intervall ist. Sie könnten einen Zeitstempel wörtlichen statt:

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

... aber das ist im Wesentlichen, was @sagi vorgeschlagen - nur mit einem Zeitstempel wörtlichen anstelle einer konvertierten Zeichenkette. Der Datumsteil spielt keine Rolle, das kann alles sein, solange die Zeit um Mitternacht ist.

Sie könnten auch eine leichte Variante verwenden; da Sie nur die Anzahl der Stunden/Minuten brauchen, um Null: einen nicht-Null-Wert

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 

Schnell Demo mit einem WAK zur Verfügung zu stellen:

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 

Und mit einem Nullwert:

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

jedes Vorkommen von time1 Ersetzen durch:

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

Upvoted, aber ich bezweifle, dass er mit dem Jahr 1 arbeiten möchte. –

+0

Hat nicht funktioniert für mich :( –

+0

Ich dachte, so etwas zu verwenden: NVL (time1, TO_DSINTERVAL ('0 00:00:00 ')) .... aber tat nicht für mich arbeiten. –

Verwandte Themen