ОШИБКА: недопустимое значение для "MI". Сведения: значение должно быть целым числом.

В PostgreSQL я получил ошибку по следующему запросу:

SELECT TO_TIMESTAMP('2020-03-07T22:34:18Z', 'YYYY-MM-DDTHH24:MI:SSZ');

что дало:

ОШИБКА: недопустимое значение ":1" для "MI" Подробности: значение должно быть целым числом.

Почему должна быть ошибка именно в ":1", а не раньше?

3 ответа

Решение

Postgres 12 работает с вашим запросом в том виде, в каком он был опубликован, 9.4 выдает указанную вами ошибку, потому что он интерпретирует DDTH как "день с буквами после" как 1st, 2nd, 3rd, 4th т.е. Nth

Итак.. парсер поглотит день 07 а затем следующие два символа и выбросьте их (T2 выброшены), затем он смотрит на следующую вещь в вашей строке формата, которая H24: - это не распознаваемый заполнитель для чего-либо, поэтому он также пропускает 4 символа из ввода, прежде чем он дойдет до MI который он распознает, но к настоящему времени :1 из :18готов к синтаксическому анализу. См. Комментарий ниже:

SELECT TO_TIMESTAMP(
  '2020-03-07T22:34:18Z', 
-- YEARsMOsDAYNssssMI
  'YYYY-MM-DDTHH24:MI');

Key: YEAR/MO/DAYN - recognised things
     s - skipped things

Чтобы игнорировать букву T, используйте пробел, а не T литерал в строке формата:

SELECT TO_TIMESTAMP('2020-03-07T22:34:18Z', 'YYYY-MM-DD HH24:MI:SS');

На самом деле, вы можете использовать почти все, что обычно пропускается.

Просто окружите литераль T с двойными кавычками:

SELECT TO_TIMESTAMP('2020-03-07"T"22:34:18Z', 'YYYY-MM-DDTHH24:MI:SSZ');

Ссылка: Функции форматирования Postgres:

В to_date, to_number, а также to_timestamp, буквальный текст и строки в двойных кавычках приводят к пропуску количества символов, содержащихся в строке.

Ваша строка хорошо отформатирована для метки времени, поэтому вы можете просто преобразовать ее:

select '2020-03-07T22:34:18Z'::timestamp
Другие вопросы по тегам