将间隔用作字符串时,Oracle字符串对于内部缓冲区太长
表创建脚本:将间隔用作字符串时,Oracle字符串对于内部缓冲区太长,oracle,oracle12c,intervals,to-char,Oracle,Oracle12c,Intervals,To Char,表创建脚本: 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
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\u COL FROM TEST
一样
但是,以下任何一项都会给我一个错误:
SELECT INTERVAL_COL || '.' FROM TEST
SELECT TO_CHAR(INTERVAL_COL, 'HH24:MM.SS') FROM TEST
错误是:
ORA-01877:字符串对于内部缓冲区太长
如果要将此
日转换为秒
数据转换为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')
也可以。如果要将此
日转换为秒
数据转换为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的输出格式始终是固定的,即它不依赖于当前用户会话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')
),尽管记录的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')
)这似乎不起作用-时间增加了4分钟:+00 11:00:24.920000
输出为11:04.24
…因为它是MI
而不是MM
。那就行了,谢谢-但这并不能解释我的错误是的,MI是必需的,。在回答中更正不确定你为什么选演员;您可以简化为“到”\u CHAR(TRUNC(SYSDATE)+INTERVAL\u COL,'HH24:MI.SS')
,或者使用日期或时间戳文字代替TRUNC'ing。@simonalexander2005-您有一个日期;施法不会恢复分数秒。但是你可以这样做:到_CHAR(时间戳'2000-01-01 00:00:00'+INTERVAL\u COL,'HH24:MI:SS.FF6')
这似乎不起作用-它在时间上增加了4分钟:+00 11:00:24.920000
被输出为11:04.24
…因为它是MI
而不是MM
。那就行了,谢谢-但这并不能解释我的错误是的,MI是必需的,。在回答中更正不确定你为什么选演员;您可以简化为“到”\u CHAR(TRUNC(SYSDATE)+INTERVAL\u COL,'HH24:MI.SS')
,或者使用日期或时间戳文字代替TRUNC'ing。@simonalexander2005-您有一个日期;施法不会恢复分数秒。但是你可以这样做:TO_CHAR(TIMESTAMP'2000-01-01 00:00:00'+INTERVAL\u COL'HH24:MI:SS.FF6')
这很奇怪,看起来可能是个bug,尽管我看不到发布的bug。它似乎特别不喜欢日(0)
。你可以在不受限制的时间间隔内施放。。。但是你不能像格式化日期或时间戳那样格式化一个时间间隔,所以你要么操纵它来获得一个日期/时间戳,要么从中提取组件并构建一个字符串()。但是你希望测试中的SELECT interval_COL | |'。
能够开箱即用,对吗?我可以在哪里向Oracle报告此情况?您可以通过support.Oracle.com提出服务请求,但您需要一个帐户和一份支持合同。您传递的是字符串,而不是间隔<代码>插入测试(间隔)值(间隔'+00 11:00:24.920000'天到秒)代码>@WernfriedDomscheit插入工作正常,并创建了一个有效的间隔-这不是问题。这很奇怪,看起来可能是个bug,尽管我看不到发布的bug。它似乎特别不喜欢日(0)
。你可以在不受限制的时间间隔内施放。。。但是你不能像格式化日期或时间戳那样格式化一个时间间隔,所以你要么操纵它来获得一个日期/时间戳,要么从中提取组件并构建一个字符串()。但是你希望测试中的SELECT interval_COL | |'。
能够开箱即用,对吗?我可以在哪里向Oracle报告此情况?您可以通过support.Oracle.com提出服务请求,但您需要一个帐户和一份支持合同。您传递的是字符串,而不是间隔<代码>插入测试(间隔)值(间隔'+00 11:00:24.920000'天到秒)
@wernfrieddomschait插入操作正常,创建有效的间隔-这不是问题to_char
的工作(通常)是以间隔开始,以字符串结束;你不能指定格式。无论如何这仍然会遇到相同的错误,从隐式到\u char(interval\u col)
。(除非你cast(INTERVAL\u COL as INTERVAL day to second)
有效,但不应该是必要的…)从好的方面来说,我认为day(0)
似乎是导致这一现象的原因,这意味着它不能超过24小时*8-to\u char
的工作(通常)从一个INTERVAL开始,以一个字符串结束;你不能指定格式。无论如何这仍然会遇到相同的错误,从隐式到\u char(interval\u col)
。(除非你cast(INTERVAL\u COL as INTERVAL day to second)
这是有效的,但不应该是必要的…)从好的方面来说,我认为导致这一现象的day(0)
意味着它不能超过24小时*8-)