ERROR: invalid value for "MI" Detail: Value must be an integer

ERROR: invalid value for "MI" Detail: Value must be an integer

在 PostgreSQL 中,我收到以下请求的错误:

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

产生了:

ERROR: invalid value ":1" for "MI" Detail: Value must be an integer.

为什么会在“:1”而不是之前出现错误?

就在文字 T 周围,用双引号引起来:

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

Reference: Postgres formatting functions:

In to_date, to_number, and to_timestamp, literal text and double-quoted strings result in skipping the number of characters contained in the string.

Postgres 12 与您发布的查询一起使用,9.4 会给出您陈述的错误,因为它将 DDTH 解释为 "day with letters after" 就像 1st, 2nd, 3rd, 4thNth

所以.. 解析器将消耗天 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 ,请在格式字符串中使用 space,而不是 T 文字:

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

实际上,您几乎可以使用通常也会被跳过的任何其他内容

您的字符串格式适合时间戳,因此您可以直接转换它:

select '2020-03-07T22:34:18Z'::timestamp