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

Hvordan vælger man et varchar2-felt i formatet 'HH24:MI:SSxFF6' som et INTERVAL HOUR TO SECOND(6)?

Du kan bruge TO_DSINTERVAL funktion ; eksempel her ved at bruge en CTE til at replikere din tabel:

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

Bemærk, at for at gøre formatet til noget, som funktionen genkender, skal du angive en 'days'-del, deraf præpenderingen af ​​dummyen '0 ' streng.

Din forespørgsel med fast værdi returnerer et lidt anderledes format (eller vises i det mindste lidt anderledes; interval daa-typer har ikke formatmodeller på nogenlunde samme måde som datoer, så jeg er ikke sikker på, hvordan man udtrykker det præcist):

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

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

For at replikere det kan du cast dette, hvis du har brug for at:

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

... eller bare:

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

... hvilket stort set er hvad @catcall først foreslog, men dette kræver også '0 ' forudsat, eller du får en ORA-01867 . (Eller hvis du prøver at bruge HOUR TO SECOND , ORA-00963 , selv med den indsatte dagsværdi). Jeg gætter dog (og det er kun et gæt, selvom det er meget lidt uddannet), at det laver en implicit TO_DSINTERVAL eller lignende, og jeg tror, ​​jeg foretrækker at bruge en eksplicit, så jeg var sikker på, hvad der sker. Det kan dog bare være mig...

Ved at bruge dine eksempeldata får jeg også en ORA-01867 , men det er forårsaget af null-værdien. Du kan bruge en case for at lade det være null i resultatet:

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.


  1. Oracle UNION forskellige kolonner

  2. Fremmednøgler og NULL i mySQL

  3. Driver.getConnection hænger ved hjælp af SQLServer-driver og Java 1.6.0_29

  4. VÆLG * FRA flere tabeller. MySQL