Můžete použít TO_DSINTERVAL
funkce
; příklad zde pomocí CTE k replikaci vaší tabulky:
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
Všimněte si, že k tomu, aby se formát stal něčím, co funkce rozpoznává, musíte zadat část 'dny', tedy předřazení figuríny '0 '
řetězec.
Váš dotaz s pevnou hodnotou vrací mírně odlišný formát (nebo se alespoň zobrazuje trochu jinak; intervalové typy daa nemají modely formátu úplně stejným způsobem jako data, takže si nejsem jistý, jak to přesně vyjádřit):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Chcete-li to replikovat, můžete cast
toto, pokud potřebujete:
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
... nebo jen:
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ž je v podstatě to, co @catcall jako první navrhl, ale také to potřebuje '0 '
nebo získáte ORA-01867
. (Nebo, pokud se pokusíte použít HOUR TO SECOND
, ORA-00963
i s předřazenou hodnotou dne). Domnívám se však (a je to jen odhad, i když velmi mírně vzdělaný), že to dělá implicitní TO_DSINTERVAL
nebo podobné a myslím, že bych raději použil explicitní, abych si byl jistý, co se děje. To bych ale mohl být jen já...
Pomocí vašich ukázkových dat jsem také dostal ORA-01867
, ale je to způsobeno hodnotou null. Můžete použít case
aby to ve výsledku zůstalo jako null:
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.