PostgreSQL中如何从时间戳提取yyyy-mm-dd格式纯日期
问题原因
DATE_TRUNC() 函数的返回值类型和输入的时间类型一致,你传入的是TIMESTAMP类型,所以哪怕截断到天粒度,返回的依然是时间戳类型,默认会显示00:00:00.0的时间部分,并不是纯日期值。
可用方案
根据你需要的返回类型,选对应写法即可:
- 如果你需要返回DATE类型的纯日期值(最常用,后续可以直接做日期计算),直接做类型转换即可,写法最简洁:
SELECT '2019-12-12T16:10:02+11:00'::TIMESTAMPTZ::DATE;
执行返回结果就是2019-12-12,不带任何时间部分。
- 如果你需要兼容标准SQL写法,不想用PostgreSQL特有的
::转换符,可以用CAST语法,效果和上面完全一致:
SELECT CAST(CAST('2019-12-12T16:10:02+11:00' AS TIMESTAMPTZ) AS DATE);
- 如果你不需要日期类型,只需要拿到
2019-12-12格式的字符串结果,可以用格式化函数直接输出:
SELECT TO_CHAR('2019-12-12T16:10:02+11:00'::TIMESTAMPTZ, 'YYYY-MM-DD');
注意事项
你原来的写法里直接用TIMESTAMP '2019-12-12T16:10:02+11:00'会直接丢弃输入的+11:00时区信息,如果你的业务需要按时区计算对应日期,一定要用TIMESTAMPTZ(带时区时间戳)类型声明输入值,避免跨时区场景下日期计算偏差。
内容的提问来源于stack exchange,提问作者user2102665
相关产品推荐
相关产品推荐

