PostgreSQL如何解析带微秒的ISO timestamp不丢失时间精度?
问题原因
你现有的写法出错是因为格式模板中的字面量字符T和Z没有用双引号包裹,PostgreSQL解析格式串时会误判这两个字符的定位,导致微秒部分没有被正确匹配,最终出现精度丢失。
解决方法
方法1:修正格式串写法
将格式模板里的固定字面量T和Z用双引号包裹即可,正确SQL如下:
select to_timestamp('2021-08-29T16:32:25.336239Z','yyyy-mm-dd"T"hh24:mi:ss.us"Z"');
解析后得到的timestamp会完整保留6位微秒精度。
方法2:直接做类型转换(更推荐)
PostgreSQL原生支持ISO 8601格式的时间字符串,不需要手动指定格式模板,直接强制转换即可:
select '2021-08-29T16:32:25.336239Z'::timestamptz;
该写法更简洁,也不会出现格式匹配错误导致的精度问题。
常见显示问题排查
如果执行正确语句后,返回结果仍然看不到微秒,属于数据库客户端的默认显示配置问题,并非数据本身精度丢失。可以用以下语句验证微秒是否正确存储:
select extract(microseconds from '2021-08-29T16:32:25.336239Z'::timestamptz);
返回结果会包含336239,即可证明微秒精度完整保留。
内容的提问来源于stack exchange,提问作者nagy.zsolt.hun
相关产品推荐
相关产品推荐

