将INTERVAL用作字符串时,Oracle字符串对于内部缓冲区来说太长



表创建脚本:

CREATE TABLE "TEST"("INTERVAL_COL" INTERVAL DAY (0) TO SECOND (6));
Insert into TEST (INTERVAL_COL) values ('+00 11:00:24.920000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:26.890000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:28.460000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:30.140000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:31.790000');
commit;

在SQLDeveloper和sqlPlus中,运行SELECT * FROM TEST和运行SELECT INTERVAL_COL FROM TEST都很好。

但是,以下任何一项都会给我一个错误:

SELECT INTERVAL_COL || '.' FROM TEST
SELECT TO_CHAR(INTERVAL_COL, 'HH24:MM.SS') FROM TEST

错误为:

ORA-01877:字符串对于内部缓冲区太长

如果要将此day to second数据转换为HH24:MI:SS,则可以使用:

TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS')

同样正如的Alex所评论的那样

TO_CHAR(TRUNC(SYSDATE)+INTERVAL_COL, 'HH24:MI.SS')

也会起作用。

尽管有文档记录,TO_CHAR似乎不适用于INTERVAL值。INTERVAL的输出格式始终是固定的,即它不依赖于当前用户会话NLS设置,因此您可以使用RegExp。

试试这个:

REGEXP_REPLACE(REGEXP_SUBSTR(INTERVAL_COL, 'd{2}:d{2}:d{2}'), ':(d{2})$', '.1') 

注意,如果间隔可能超过24小时,则结果将是错误的(TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS')等解决方案也是如此(

最新更新