ОШИБКА: недопустимое значение для "MI" Подробно: значение должно быть целым числом - PullRequest
0 голосов
/ 09 марта 2020

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

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

, что привело к:

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

Почему возникла бы ошибка именно в «: 1», а не раньше?

Ответы [ 3 ]

1 голос
/ 09 марта 2020

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');

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

1 голос
/ 09 марта 2020

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

select '2020-03-07T22:34:18Z'::timestamp
1 голос
/ 09 марта 2020

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

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

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

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

...