Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wählen Sie ein varchar2-Feld im Format „HH24:MI:SSxFF6“ als INTERVAL HOUR TO SECOND(6) aus?

Sie können den TO_DSINTERVAL verwenden Funktion ; Beispiel hier mit einem CTE, um Ihre Tabelle zu replizieren:

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

Beachten Sie, dass Sie einen „Tage“-Teil angeben müssen, damit das Format von der Funktion erkannt wird, daher das Voranstellen des Platzhalters '0 ' Zeichenfolge.

Ihre Festwertabfrage gibt ein etwas anderes Format zurück (oder wird zumindest etwas anders angezeigt; Intervall-DAA-Typen haben keine Formatmodelle genauso wie Datumsangaben, also bin ich mir nicht sicher, wie ich das genau ausdrücken soll):

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

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

Um das zu replizieren, können Sie cast Dies bei Bedarf:

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

... oder einfach nur:

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

... was @catcall zuerst vorgeschlagen hat, aber dies benötigt auch den '0 ' vorangestellt, oder Sie erhalten einen ORA-01867 . (Oder wenn Sie versuchen, HOUR TO SECOND zu verwenden , ORA-00963 , sogar mit vorangestelltem Tageswert). Ich vermute jedoch (und es ist nur eine Vermutung, wenn auch sehr wenig gebildet), dass es ein implizites TO_DSINTERVAL macht oder ähnlich, und ich denke, ich würde es vorziehen, eine explizite zu verwenden, damit ich sicher war, was passiert. Das könnte aber auch nur ich sein...

Mit Ihren Beispieldaten bekomme ich auch einen ORA-01867 , aber es wird durch den Nullwert verursacht. Sie können einen case verwenden um das als null im Ergebnis zu belassen:

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.