PostgreSQL 12中jsonb值转timestamp报YYYY值无效如何解决
问题产生原因
- 根因是jsonb取值的类型转换逻辑错误:使用
->操作符从jsonb列提取字段时,返回结果仍为jsonb类型,直接强转为text时会保留JSON字符串的外层包裹双引号,最终传入to_timestamp的实际值是首尾带引号的"2022-06-30T11:19:51.459596+00:00",和你单测时传入的无引号纯时间字符串不一致。解析年份字段时,开头的引号会被识别为无效字符,仅能读取到"202片段,因此触发invalid value ""202" for "YYYY"报错。 - 额外逻辑隐患:你使用的格式模板
YYYY-MM-DDTHH:MI:SS没有匹配时间串中的微秒、时区后缀,即使解决引号问题,转换结果也会丢失精度,且小时位未指定24小时制,会出现12小时制解析的时间偏差。
正确实现方式
使用jsonb专用的文本提取操作符->>直接取值,该操作符会自动剥离JSON格式的外层引号,直接返回原生text类型的时间串。PostgreSQL原生支持ISO8601格式时间的自动类型转换,无需手写to_timestamp格式模板,写法更简洁也不易出错:
select count(*) from users u where (u.column_name ->> 'timestamp_value')::timestamptz >= '2022-06-30'
如果需要明确使用to_timestamp做格式校验,补全格式匹配规则即可,注意小时位必须用HH24指定24小时制:
select count(*) from users u where to_timestamp( u.column_name ->> 'timestamp_value', 'YYYY-MM-DD"T"HH24:MI:SS.USTZH:TZM' ) >= '2022-06-30'
内容的提问来源于stack exchange,提问作者Jayaram
相关产品推荐
相关产品推荐

