Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wybrać pole varchar2 w formacie 'HH24:MI:SSxFF6' jako PRZERWA GODZINA DO SEKUND (6)?

Możesz użyć TO_DSINTERVAL funkcja ; przykład tutaj przy użyciu CTE do replikacji tabeli:

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

Zauważ, że aby format był rozpoznawany przez funkcję, musisz podać część 'dni', stąd wstawka '0 ' ciąg.

Twoje zapytanie o stałej wartości zwraca nieco inny format (lub przynajmniej wyświetla się nieco inaczej; Typy danych interwałowych nie mają modeli formatu w taki sam sposób jak daty, więc nie jestem pewien, jak to dokładnie wyrazić):

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

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

Aby powtórzyć, że możesz cast to jeśli potrzebujesz:

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

... lub po prostu:

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

... co jest w zasadzie tym, co najpierw zasugerował @catcall, ale wymaga to również '0 ' z dopiskiem lub otrzymasz ORA-01867 . (Lub, jeśli spróbujesz użyć HOUR TO SECOND , ORA-00963 , nawet z dodaną wartością dnia). Jednak sądzę (i to tylko przypuszczenie, choć bardzo słabo wykształcone), że robi niejawne TO_DSINTERVAL lub podobny i myślę, że wolałbym użyć wyraźnego, więc byłem pewien, co się dzieje. Ale to może być tylko ja...

Korzystając z twoich przykładowych danych, również otrzymuję ORA-01867 , ale jest to spowodowane wartością null. Możesz użyć case aby pozostawić to jako null w wyniku:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj starsze sprzężenie zewnętrzne Oracle na Ansi SQL

  2. Ustaw Oracle NLS_LANGUAGE z java w aplikacji internetowej

  3. Co to jest Cofanie i ponawianie w bazie danych Oracle

  4. Procedura eksportowania tabeli do wielu plików csv

  5. Etap APPL_TOP w aplikacjach Oracle R12