ОШИБКА: недопустимое значение для "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