sql >> Databáze >  >> RDS >> Oracle

Jak vyberete pole varchar2 ve formátu 'HH24:MI:SSxFF6' jako INTERVAL HOUR TO SECOND(6)?

Můžete použít TO_DSINTERVAL funkce ; příklad zde pomocí CTE k replikaci vaší tabulky:

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

Všimněte si, že k tomu, aby se formát stal něčím, co funkce rozpoznává, musíte zadat část 'dny', tedy předřazení figuríny '0 ' řetězec.

Váš dotaz s pevnou hodnotou vrací mírně odlišný formát (nebo se alespoň zobrazuje trochu jinak; intervalové typy daa nemají modely formátu úplně stejným způsobem jako data, takže si nejsem jistý, jak to přesně vyjádřit):

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

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

Chcete-li to replikovat, můžete cast toto, pokud potřebujete:

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

... nebo jen:

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ž je v podstatě to, co @catcall jako první navrhl, ale také to potřebuje '0 ' nebo získáte ORA-01867 . (Nebo, pokud se pokusíte použít HOUR TO SECOND , ORA-00963 i s předřazenou hodnotou dne). Domnívám se však (a je to jen odhad, i když velmi mírně vzdělaný), že to dělá implicitní TO_DSINTERVAL nebo podobné a myslím, že bych raději použil explicitní, abych si byl jistý, co se děje. To bych ale mohl být jen já...

Pomocí vašich ukázkových dat jsem také dostal ORA-01867 , ale je to způsobeno hodnotou null. Můžete použít case aby to ve výsledku zůstalo jako null:

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. SQL Server 2008 – Získejte omezení tabulky

  2. Jak vyloučit funkce PL/pgSQL při exportu?

  3. Smíšené dotazy MySQL a Sphinx

  4. Zpracování výjimek EntityManager v session bean