Możesz użyć TO_DSINTERVAL
funkcja
; przykład tutaj przy użyciu CTE do replikacji tabeli:
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
Zauważ, że aby format był rozpoznawany przez funkcję, musisz podać część 'dni', stąd wstawka '0 '
ciąg.
Twoje zapytanie o stałej wartości zwraca nieco inny format (lub przynajmniej wyświetla się nieco inaczej; Typy danych interwałowych nie mają modeli formatu w taki sam sposób jak daty, więc nie jestem pewien, jak to dokładnie wyrazić):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Aby powtórzyć, że możesz cast
to jeśli potrzebujesz:
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
... lub po prostu:
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
... co jest w zasadzie tym, co najpierw zasugerował @catcall, ale wymaga to również '0 '
z dopiskiem lub otrzymasz ORA-01867
. (Lub, jeśli spróbujesz użyć HOUR TO SECOND
, ORA-00963
, nawet z dodaną wartością dnia). Jednak sądzę (i to tylko przypuszczenie, choć bardzo słabo wykształcone), że robi niejawne TO_DSINTERVAL
lub podobny i myślę, że wolałbym użyć wyraźnego, więc byłem pewien, co się dzieje. Ale to może być tylko ja...
Korzystając z twoich przykładowych danych, również otrzymuję ORA-01867
, ale jest to spowodowane wartością null. Możesz użyć case
aby pozostawić to jako null w wyniku:
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.