sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo selecciona un campo varchar2 en el formato de 'HH24:MI:SSxFF6' como un INTERVALO DE HORA A SEGUNDO (6)?

Puede usar el TO_DSINTERVAL función ; ejemplo aquí usando un CTE para replicar su tabla:

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

Tenga en cuenta que para hacer que el formato sea algo que la función reconozca, debe proporcionar una parte de 'días', de ahí la anteposición del '0 ' ficticio cadena.

Su consulta de valor fijo devuelve un formato ligeramente diferente (o al menos se muestra ligeramente diferente; los tipos de daa de intervalo no tienen modelos de formato de la misma manera que las fechas, así que no estoy seguro de cómo expresarlo con precisión):

SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;

INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000

Para replicar eso puedes cast esto si necesitas:

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

... o simplemente:

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

... que es más o menos lo que @catcall sugirió primero, pero esto también necesita el '0 ' antepuesto, o obtienes un ORA-01867 . (O, si intenta usar HOUR TO SECOND , ORA-00963 , incluso con el valor del día antepuesto). Sin embargo, supongo (y es solo una suposición, aunque un poco educada) que está haciendo un TO_DSINTERVAL implícito o similar, y creo que preferiría usar uno explícito para estar seguro de lo que está sucediendo. Aunque podría ser solo yo...

Usando sus datos de muestra, también obtengo un ORA-01867 , pero es causado por el valor nulo. Puedes usar un case para dejar eso como nulo en el resultado:

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.