Du kan bruge TO_DSINTERVAL
funktion
; eksempel her ved at bruge en CTE til at replikere din tabel:
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
Bemærk, at for at gøre formatet til noget, som funktionen genkender, skal du angive en 'days'-del, deraf præpenderingen af dummyen '0 '
streng.
Din forespørgsel med fast værdi returnerer et lidt anderledes format (eller vises i det mindste lidt anderledes; interval daa-typer har ikke formatmodeller på nogenlunde samme måde som datoer, så jeg er ikke sikker på, hvordan man udtrykker det præcist):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
For at replikere det kan du cast
dette, hvis du har brug for at:
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
... eller bare:
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
... hvilket stort set er hvad @catcall først foreslog, men dette kræver også '0 '
forudsat, eller du får en ORA-01867
. (Eller hvis du prøver at bruge HOUR TO SECOND
, ORA-00963
, selv med den indsatte dagsværdi). Jeg gætter dog (og det er kun et gæt, selvom det er meget lidt uddannet), at det laver en implicit TO_DSINTERVAL
eller lignende, og jeg tror, jeg foretrækker at bruge en eksplicit, så jeg var sikker på, hvad der sker. Det kan dog bare være mig...
Ved at bruge dine eksempeldata får jeg også en ORA-01867
, men det er forårsaget af null-værdien. Du kan bruge en case
for at lade det være null i resultatet:
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.