使用 INTERVAL 作为字符串时,Oracle 字符串对于内部缓冲区来说太长
Oracle string is too long for internal buffer when using INTERVAL as string
Table 创建脚本:
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;
在 SQL Developer 和 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: string is too long for internal buffer
如果要将此 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})$', '.')
注意,如果间隔可能大于 24 小时,则结果将是错误的(同样适用于 TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS')
等解决方案)
Table 创建脚本:
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;
在 SQL Developer 和 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: string is too long for internal buffer
如果要将此 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})$', '.')
注意,如果间隔可能大于 24 小时,则结果将是错误的(同样适用于 TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS')
等解决方案)