U kunt de TO_DSINTERVAL
gebruiken functie
; voorbeeld hier met een CTE om uw tabel te repliceren:
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
Merk op dat om het formaat iets te maken dat de functie herkent, je een 'dagen'-gedeelte moet opgeven, vandaar de toevoeging van de dummy '0 '
tekenreeks.
Uw zoekopdracht met een vaste waarde retourneert een iets andere indeling (of wordt in ieder geval iets anders weergegeven; interval daa-typen hebben geen formaatmodellen op dezelfde manier als datums, dus ik weet niet hoe je dat nauwkeurig moet uitdrukken):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Om dat te repliceren kun je cast
dit indien nodig:
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
... of gewoon:
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
... wat ongeveer is wat @catcall eerst suggereerde, maar dit heeft ook de '0 '
. nodig toegevoegd, of je krijgt een ORA-01867
. (Of, als u HOUR TO SECOND
probeert te gebruiken , ORA-00963
, zelfs met de toegevoegde dagwaarde). Ik vermoed echter (en het is slechts een gok, hoewel zeer licht ontwikkeld) dat het een impliciete TO_DSINTERVAL
doet of iets dergelijks, en ik denk dat ik liever een expliciete zou gebruiken, zodat ik zeker wist wat er aan de hand was. Maar dat kan aan mij liggen...
Met behulp van uw voorbeeldgegevens krijg ik ook een ORA-01867
, maar het wordt veroorzaakt door de null-waarde. U kunt een case
. gebruiken om dat als null in het resultaat te laten:
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.