Можете да използвате 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.