ORA-01830: 日期格式图片在转换整个输入字符串之前结束,尽管使用 TO_TIMESTAMP
ORA-01830: date format picture ends before converting entire input string inspite of using TO_TIMESTAMP
尽管使用了 TO_TIMESTAMP
函数,我的查询(当被应用程序触发时)仍无法执行并出现此错误。
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
这是错误消息 -
{FAILED after 2 ms}
java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input string
此错误仅在一个环境中抛出,但在其他环境中正常。
手动执行查询也能正常工作。
所有环境中的会话时间戳格式都相同(登录时由触发器更新)。
[TL;DR] 使用时间戳文字来避免整个问题:
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TIMESTAMP '2018-05-31 14:45:32.000',
TIMESTAMP '2018-05-31 14:45:32.000',
'test',
TIMESTAMP '2018-06-09 14:45:00.000'
);
如果不能则检查NLS_NUMERIC_CHARACTERS
database/session参数。如果小数点不是 .
,那么 x
格式模型将不会匹配 .
,但会匹配 database/session 使用的任何字符,并且不会匹配字符串。
Oracle 11g R2 架构设置:
CREATE TABLE MY_TABLE_NAME (
UPDATED_DATE TIMESTAMP,
CREATED_DATE TIMESTAMP,
TEST_SUBJECT VARCHAR2(20),
THIRD_DATE TIMESTAMP
);
查询 1:
-- Set decimal separator to "." and thousands separator to ","
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
SELECT * FROM MY_TABLE_NAME
| UPDATED_DATE | CREATED_DATE | TEST_SUBJECT | THIRD_DATE |
|-----------------------|-----------------------|--------------|-----------------------|
| 2018-05-31 14:45:32.0 | 2018-05-31 14:45:32.0 | test | 2018-06-09 14:45:00.0 |
查询 2:
-- Set decimal separator to "," and thousands separator to " "
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', '
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
ORA-01830: date format picture ends before converting entire input string
另一种解决方案是使用 'YYYY-MM-DD HH24:MI:SS.FF'
作为格式模型,而不是依赖 x
格式模型以在 instances/sessions.
中始终保持一致
尽管使用了 TO_TIMESTAMP
函数,我的查询(当被应用程序触发时)仍无法执行并出现此错误。
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
这是错误消息 -
{FAILED after 2 ms}
java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input string
此错误仅在一个环境中抛出,但在其他环境中正常。
手动执行查询也能正常工作。
所有环境中的会话时间戳格式都相同(登录时由触发器更新)。
[TL;DR] 使用时间戳文字来避免整个问题:
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TIMESTAMP '2018-05-31 14:45:32.000',
TIMESTAMP '2018-05-31 14:45:32.000',
'test',
TIMESTAMP '2018-06-09 14:45:00.000'
);
如果不能则检查NLS_NUMERIC_CHARACTERS
database/session参数。如果小数点不是 .
,那么 x
格式模型将不会匹配 .
,但会匹配 database/session 使用的任何字符,并且不会匹配字符串。
Oracle 11g R2 架构设置:
CREATE TABLE MY_TABLE_NAME (
UPDATED_DATE TIMESTAMP,
CREATED_DATE TIMESTAMP,
TEST_SUBJECT VARCHAR2(20),
THIRD_DATE TIMESTAMP
);
查询 1:
-- Set decimal separator to "." and thousands separator to ","
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
SELECT * FROM MY_TABLE_NAME
| UPDATED_DATE | CREATED_DATE | TEST_SUBJECT | THIRD_DATE |
|-----------------------|-----------------------|--------------|-----------------------|
| 2018-05-31 14:45:32.0 | 2018-05-31 14:45:32.0 | test | 2018-06-09 14:45:00.0 |
查询 2:
-- Set decimal separator to "," and thousands separator to " "
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', '
INSERT INTO MY_TABLE_NAME (
UPDATED_DATE,
CREATED_DATE,
TEST_SUBJECT,
THIRD_DATE
) VALUES (
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
TO_TIMESTAMP('2018-05-31 14:45:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
'test',
TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
ORA-01830: date format picture ends before converting entire input string
另一种解决方案是使用 'YYYY-MM-DD HH24:MI:SS.FF'
作为格式模型,而不是依赖 x
格式模型以在 instances/sessions.