Puoi utilizzare TO_DSINTERVAL
funzione
; esempio qui usando un CTE per replicare la tua tabella:
WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT TO_DSINTERVAL('0 ' || time_field)
FROM some_table;
TO_DSINTERVAL('0'||TIME_FIELD)
---------------------------------------------------------------------------
+000000000 00:00:00.000000000
Nota che per rendere il formato qualcosa che la funzione riconosce, devi fornire una parte 'giorni', da cui la anteposizione del dummy '0 '
stringa.
La query a valore fisso restituisce un formato leggermente diverso (o almeno viene visualizzata in modo leggermente diverso; I tipi daa di intervallo non hanno modelli di formato allo stesso modo delle date, quindi non sono sicuro di come esprimerlo accuratamente):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Per replicare puoi cast
questo se necessario:
WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST(TO_DSINTERVAL('0 ' || time_field) AS INTERVAL DAY TO SECOND(6))
FROM some_table;
CAST(TO_DSINTERVAL('0'||TIME_FIELD)ASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000
... o semplicemente:
WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6))
FROM some_table;
CAST('0'||TIME_FIELDASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000
... che è più o meno ciò che @catcall ha suggerito per la prima volta, ma questo richiede anche il '0 '
anteposto o ottieni un ORA-01867
. (Oppure, se provi a utilizzare HOUR TO SECOND
, ORA-00963
, anche con il valore del giorno anteposto). Tuttavia, suppongo (ed è solo un'ipotesi, anche se molto poco istruita) che stia facendo un implicito TO_DSINTERVAL
o simili, e penso che preferirei usarne uno esplicito in modo da essere sicuro di cosa sta succedendo. Potrei essere solo io, però...
Utilizzando i tuoi dati di esempio, anch'io ottengo un ORA-01867
, ma è causato dal valore null. Puoi usare un case
per lasciarlo come null nel risultato:
SELECT CASE WHEN time_field IS NULL THEN null
ELSE CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6)) END
FROM some_table;
CASEWHENTIME_FIELDISNULLTHENNULLELSECAST('0'||TIME_FIELDASINTERVALDAYTOSECO
---------------------------------------------------------------------------
+00 10:00:00.000000
+00 12:00:00.000000
+00 15:00:00.000000
+00 17:00:00.000000
+00 20:00:00.000000
6 rows selected.