PostgreSQL中to_timestamp()转换JSON内Unix时间戳整数失效问题
PostgreSQL中JSON字段的Unix时间戳转日期问题解决
问题原因
你执行的select to_timestamp(info->'created_at') from booking;无法生效,是因为info->'created_at'返回的是JSON类型的字符串值,而to_timestamp()函数仅接受数值类型(integer/bigint)作为参数,类型不匹配导致转换失败。
解决方案
需要先将JSON字段中的字符串提取为文本,再转换为数值类型后传入to_timestamp(),以下是几种可行写法:
最常用的写法,使用
->>操作符提取文本值:SELECT to_timestamp((info->>'created_at')::bigint) FROM booking;说明:
->>会直接将JSON字段的内容转为PostgreSQL文本类型,再通过::bigint强制转换为整数,最后由to_timestamp()转为可读日期时间。使用
json_extract_path_text函数提取文本(效果与->>一致):SELECT to_timestamp(json_extract_path_text(info, 'created_at')::bigint) FROM booking;处理空值或无效值的健壮写法:
如果存在created_at为空字符串或非数值的情况,可通过NULLIF避免转换报错:SELECT to_timestamp(NULLIF(info->>'created_at', '')::bigint) FROM booking;当
created_at为空字符串时,该表达式会返回NULL而非抛出转换错误。
验证示例
假设info字段值为{"created_at": "1667801192"},执行上述查询后会返回对应的日期时间(具体时区取决于数据库配置,例如2022-11-06 10:06:32+08)。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

