ORA-01830:日期格式图片在转换整个输入字符串之前结束,尽管使用了TO_TIMESTAMP

Cap*_*row 2 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:32.000', 'YYYY-MM-DD HH24:MI:SSxFF'),
  'test',
  TO_TIMESTAMP('2018-06-09 14:45:00.000', 'YYYY-MM-DD HH24:MI:SSxFF')
)
Run Code Online (Sandbox Code Playgroud)

这是错误信息 -

{FAILED after 2 ms}
java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input string
Run Code Online (Sandbox Code Playgroud)

此错误仅在一个环境中引发,但在其他环境中正常工作.

手动执行查询也可以正常工作.

所有环境中的会话时间戳格式都相同(登录时由触发器更新).

MT0*_*MT0 6

[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'
);
Run Code Online (Sandbox Code Playgroud)

如果您无法检查NLS_NUMERIC_CHARACTERS数据库/会话参数.如果小数点不是,.那么x格式模型将不匹配a,.但将匹配数据库/会话正在使用的任何字符,并且字符串将不匹配.

SQL小提琴

Oracle 11g R2架构设置:

CREATE TABLE MY_TABLE_NAME (
  UPDATED_DATE TIMESTAMP,
  CREATED_DATE TIMESTAMP,
  TEST_SUBJECT VARCHAR2(20),
  THIRD_DATE   TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

查询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
Run Code Online (Sandbox Code Playgroud)

结果:

|          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 |
Run Code Online (Sandbox Code Playgroud)

查询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')
)
Run Code Online (Sandbox Code Playgroud)

结果:

ORA-01830: date format picture ends before converting entire input string 
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用'YYYY-MM-DD HH24:MI:SS.FF'格式模型而不是依赖于x格式模型来始终在实例/会话之间保持一致.