如何将ISO 8601格式字符串转为日期?PostgreSQL转换语句失效求助
将ISO 8601字符串转换为PostgreSQL日期类型
以下是几种可行的转换方法,可解决你原语句可能因时区设置导致结果不符合预期的问题:
方法1:使用
TO_TIMESTAMP指定格式后转日期
通过明确格式字符串解析ISO 8601时间,再转换为日期类型:SELECT DATE(TO_TIMESTAMP('2023-06-14T17:48:52.012Z', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"'));方法2:修正原语句,明确UTC时区转换
原方法无效大概率是数据库时区与UTC不一致导致日期偏移,通过AT TIME ZONE指定UTC时区后再转日期:SELECT ('2023-06-14T17:48:52.012Z'::timestamptz AT TIME ZONE 'UTC')::date;方法3:直接用
TO_DATE提取日期部分
如果仅需要提取字符串中的日期部分,忽略时间和时区信息,可直接使用:SELECT TO_DATE('2023-06-14T17:48:52.012Z', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"');
补充说明:原语句
SELECT '2023-06-14T17:48:52.012Z'::timestampz::date的问题在于,当数据库时区不是UTC时,带时区的时间戳会转换为本地时区的时间,再取日期就会出现偏移。比如数据库时区为东八区时,原时间戳会转为2023-06-15 01:48:52+08,转日期后得到2023-06-15,而非预期的2023-06-14。
内容的提问来源于stack exchange,提问作者Zubair Amjad
相关产品推荐
相关产品推荐

