sql >> Database >  >> RDS >> Oracle

Hoe selecteer je een varchar2-veld in het formaat 'HH24:MI:SSxFF6' als INTERVAL HOUR TO SECOND (6)?

U kunt de TO_DSINTERVAL gebruiken functie ; voorbeeld hier met een CTE om uw tabel te repliceren:

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

Merk op dat om het formaat iets te maken dat de functie herkent, je een 'dagen'-gedeelte moet opgeven, vandaar de toevoeging van de dummy '0 ' tekenreeks.

Uw zoekopdracht met een vaste waarde retourneert een iets andere indeling (of wordt in ieder geval iets anders weergegeven; interval daa-typen hebben geen formaatmodellen op dezelfde manier als datums, dus ik weet niet hoe je dat nauwkeurig moet uitdrukken):

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

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

Om dat te repliceren kun je cast dit indien nodig:

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

... of gewoon:

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

... wat ongeveer is wat @catcall eerst suggereerde, maar dit heeft ook de '0 ' . nodig toegevoegd, of je krijgt een ORA-01867 . (Of, als u HOUR TO SECOND probeert te gebruiken , ORA-00963 , zelfs met de toegevoegde dagwaarde). Ik vermoed echter (en het is slechts een gok, hoewel zeer licht ontwikkeld) dat het een impliciete TO_DSINTERVAL doet of iets dergelijks, en ik denk dat ik liever een expliciete zou gebruiken, zodat ik zeker wist wat er aan de hand was. Maar dat kan aan mij liggen...

Met behulp van uw voorbeeldgegevens krijg ik ook een ORA-01867 , maar het wordt veroorzaakt door de null-waarde. U kunt een case . gebruiken om dat als null in het resultaat te laten:

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. fail execute-statement met php en mysql

  2. Krijg waarden van de eerste en laatste rij per groep

  3. Excel versus Access:wanneer is het tijd om over te stappen?

  4. Android:hoe een afbeelding in mysql te uploaden met php