在 PostgreSQL 中,我收到以下请求的错误:
SELECT TO_TIMESTAMP('2020-03-07T22:34:18Z', 'YYYY-MM-DDTHH24:MI:SSZ');
这产生了:
错误:“MI”的无效值“:1”详细信息:值必须是整数。
为什么会在“:1”而不是之前出现错误?
在 PostgreSQL 中,我收到以下请求的错误:
SELECT TO_TIMESTAMP('2020-03-07T22:34:18Z', 'YYYY-MM-DDTHH24:MI:SSZ');
这产生了:
错误:“MI”的无效值“:1”详细信息:值必须是整数。
为什么会在“:1”而不是之前出现错误?
只需T
用双引号将文字括起来:
SELECT TO_TIMESTAMP('2020-03-07"T"22:34:18Z', 'YYYY-MM-DDTHH24:MI:SSZ');
在
to_date
、to_number
和to_timestamp
中,文字文本和双引号字符串会导致跳过字符串中包含的字符数。
Postgres 12 与您发布的查询一起使用,9.4 给出了您所说的错误,因为它被解释DDTH
为“之后有字母的日子”,例如1st, 2nd, 3rd, 4th
ieNth
所以..解析器将消耗一天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');
实际上,您几乎可以使用通常会被跳过的任何其他内容
您的字符串格式适合时间戳,因此您可以将其转换:
select '2020-03-07T22:34:18Z'::timestamp