Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将间隔用作字符串时,Oracle字符串对于内部缓冲区太长_Oracle_Oracle12c_Intervals_To Char - Fatal编程技术网

将间隔用作字符串时,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-)