sql >> Databasteknik >  >> RDS >> Oracle

Hur väljer man ett varchar2-fält i formatet 'HH24:MI:SSxFF6' som ett INTERVAL TIMME TILL SEKUND(6)?

Du kan använda TO_DSINTERVAL funktion ; exempel här använder en CTE för att replikera din tabell:

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

Observera att för att göra formatet till något som funktionen känner igen, måste du ange en "days"-del, därav prepending av dummyn '0 ' sträng.

Din fråga med fast värde returnerar ett något annat format (eller visas åtminstone något annorlunda; intervall daa-typer har inte formatmodeller på ungefär samma sätt som datum, så jag är inte säker på hur man uttrycker det korrekt):

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

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

För att replikera det kan du cast detta om du behöver:

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

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

... vilket är ungefär vad @catcall först föreslog, men detta behöver också '0 ' prepended, eller så får du en ORA-01867 . (Eller om du försöker använda HOUR TO SECOND , ORA-00963 , även med det inledande dagvärdet). Jag antar dock (och det är bara en gissning, även om det är väldigt lite utbildad) att den gör en implicit TO_DSINTERVAL eller liknande, och jag tror att jag föredrar att använda en explicit så jag var säker på vad som händer. Det kanske bara är jag...

Med hjälp av dina exempeldata får jag också en ORA-01867 , men det orsakas av nollvärdet. Du kan använda ett case för att lämna det som 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. Escape understreck i PL/SQL

  2. Använder SUM() utan att gruppera resultaten

  3. FEL 1114 (HY000):Tabellen 'XXX' är full

  4. MySQL-fråga som lägger till tomrum för att fylla luckorna