Oracle ORA-01830:日期格式图片在将整个输入字符串转换为时间戳之前结束

Oracle ORA-01830:日期格式图片在将整个输入字符串转换为时间戳之前结束,oracle,date,insert,ora-01830,Oracle,Date,Insert,Ora 01830,尽管使用了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

尽管使用了
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\u数字\u字符
数据库/会话参数。如果小数点不是
,则
x
格式模型将不匹配
,但将匹配数据库/会话使用的任何字符,并且字符串将不匹配

Oracle 11g R2架构设置

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
-- 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 |
-- 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 
查询1

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
-- 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 |
-- 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 

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
-- 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 |
-- 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 
查询2

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
-- 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 |
-- 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 

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
-- 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 |
-- 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
格式模型在实例/会话之间始终保持一致。

您应该发布表DDLsThanks@MT0这看起来是一个很有希望的解决方案。我无法控制查询生成部分,但我当然可以尝试将
ALTER SESSION SET NLS\u NUMERIC\u CHARACTERS=','
推送到这个环境上的数据库。看看这能不能解决问题。非常感谢分享这些知识,非常感谢。@CaptainJackSparrow请注意,如果会话参数依赖于这些参数的默认值,则更改会话参数可能会中断其他查询。如果可以的话,最好的解决方案是使用一些独立于这些参数的东西。嘿@MT0,我有一个跟进。因此,我检查了数据库参数和
NLS\u NUMERIC\u CHARACTERS
的值已经
只有当应用程序访问数据库时,该会话才会将该参数的值设置为
是否需要更改数据库上的其他设置,以使应用程序用户的会话参数具有正确的值(