Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment sélectionnez-vous un champ varchar2 au format 'HH24:MI:SSxFF6' comme INTERVAL HOUR TO SECOND(6) ?

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.