Vous pouvez utiliser le TO_DSINTERVAL
fonction
; exemple ici en utilisant un CTE pour répliquer votre table :
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
Notez que pour rendre le format quelque chose que la fonction reconnaît, vous devez fournir une partie 'days', d'où l'ajout du factice '0 '
chaîne.
Votre requête à valeur fixe renvoie un format légèrement différent (ou du moins s'affiche légèrement différemment ; les types daa d'intervalle n'ont pas de modèles de format à peu près de la même manière que les dates, donc je ne sais pas comment exprimer cela avec précision):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Pour répliquer cela, vous pouvez cast
ceci si vous en avez besoin :
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
... ou simplement :
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
... ce qui est à peu près ce que @catcall a d'abord suggéré, mais cela nécessite également le '0 '
préfixé, ou vous obtenez un ORA-01867
. (Ou, si vous essayez d'utiliser HOUR TO SECOND
, ORA-00963
, même avec la valeur du jour ajoutée). Cependant, je suppose (et ce n'est qu'une supposition, bien que très légèrement éduquée) qu'il fait un TO_DSINTERVAL
implicite ou similaire, et je pense que je préférerais en utiliser un explicite pour être sûr de ce qui se passe. C'est peut-être moi, cependant...
En utilisant vos exemples de données, j'obtiens moi aussi un ORA-01867
, mais cela est dû à la valeur nulle. Vous pouvez utiliser un case
pour laisser cela comme nul dans le résultat :
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.