Oracle
 sql >> база данни >  >> RDS >> Oracle

Как избирате поле varchar2 във формат „HH24:MI:SSxFF6“ като ИНТЕРВАЛ ЧАС ДО СЕКУНДА(6)?

Можете да използвате TO_DSINTERVAL функция ; пример тук с използване на CTE за репликиране на вашата таблица:

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

Обърнете внимание, че за да направите формата нещо, което функцията да разпознава, трябва да предоставите част „дни“, следователно добавянето на фиктивния '0 ' низ.

Вашата заявка с фиксирана стойност връща малко по-различен формат (или поне се показва малко по-различно; интервалните daa типове нямат форматни модели по същия начин като датите, така че не съм сигурен как да изразя това точно):

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

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

За да копирате това, можете да cast това, ако трябва:

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

... или просто:

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

... което е почти това, което @catcall първо предложи, но това също се нуждае от '0 ' в началото или получавате ORA-01867 . (Или, ако се опитате да използвате HOUR TO SECOND , ORA-00963 , дори с добавената стойност на деня). Предполагам обаче (и това е само предположение, макар и много малко информирано), че прави имплицитно TO_DSINTERVAL или подобен и мисля, че бих предпочел да използвам изричен, за да съм сигурен какво се случва. Това обаче може да съм само аз...

Използвайки вашите примерни данни, аз също получавам ORA-01867 , но това е причинено от нулевата стойност. Можете да използвате case за да оставите това като 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Посочете пътя на класа за maven

  2. Как да добавите набор от ключове (UniqueID) към временна таблица за по-късно INSERT в производствена таблица

  3. ORA-04091 - Как мога да променя таблица, върху която се задейства тригер?

  4. Как получавате следващата стойност в последователност в променлива?

  5. Ограничете заявката за изтриване с хибернация