ORA-01830: изображение в формате даты заканчивается перед преобразованием всей входной строки, несмотря на использование TO_TIMESTAMP - PullRequest
0 голосов
/ 01 июня 2018

Мой запрос (при запуске приложения) не выполняется с этой ошибкой, несмотря на использование функции 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

Эта ошибка генерируется только в одной среде, но отлично работает в других средах.

Выполнение запроса также работает нормально.

Формат метки времени сеанса во всех средах одинаков (обновляетсятриггер при входе в систему).

1 Ответ

0 голосов
/ 01 июня 2018

[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 база данных / сеанс.Если десятичная точка не ., то модель формата x не будет соответствовать ., но будет соответствовать любому символу, который использует база данных / сеанс, и строка не будет соответствовать.

SQL Fiddle

Настройка схемы 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 для обеспечения согласованности между экземплярами / сеансами.

...