Oracle
 sql >> Database >  >> RDS >> Oracle

Come si seleziona un campo varchar2 nel formato 'HH24:MI:SSxFF6' come INTERVAL HOUR TO SECOND(6)?

Puoi utilizzare TO_DSINTERVAL funzione ; esempio qui usando un CTE per replicare la tua tabella:

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

Nota che per rendere il formato qualcosa che la funzione riconosce, devi fornire una parte 'giorni', da cui la anteposizione del dummy '0 ' stringa.

La query a valore fisso restituisce un formato leggermente diverso (o almeno viene visualizzata in modo leggermente diverso; I tipi daa di intervallo non hanno modelli di formato allo stesso modo delle date, quindi non sono sicuro di come esprimerlo accuratamente):

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

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

Per replicare puoi cast questo se necessario:

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 semplicemente:

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

... che è più o meno ciò che @catcall ha suggerito per la prima volta, ma questo richiede anche il '0 ' anteposto o ottieni un ORA-01867 . (Oppure, se provi a utilizzare HOUR TO SECOND , ORA-00963 , anche con il valore del giorno anteposto). Tuttavia, suppongo (ed è solo un'ipotesi, anche se molto poco istruita) che stia facendo un implicito TO_DSINTERVAL o simili, e penso che preferirei usarne uno esplicito in modo da essere sicuro di cosa sta succedendo. Potrei essere solo io, però...

Utilizzando i tuoi dati di esempio, anch'io ottengo un ORA-01867 , ma è causato dal valore null. Puoi usare un case per lasciarlo come null nel risultato:

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.