如何保留timestamp/datetime类型并去除毫秒数?多种尝试报错求助
解决PostgreSQL去除timestamp毫秒数并保留类型的问题
针对你的需求,这里提供几种可行方案,同时解释你遇到的问题:
可行方法
方法1:利用date_trunc处理(注意显示与存储的区别)
你之前用date_trunc('second', date_created)得到的结果虽然显示.000000,但实际上该值已经被截断到秒级,内部存储的timestamp类型是不包含毫秒信息的。如果只是想让查询结果不显示毫秒,可结合类型转换:
SELECT date_trunc('second', date_created)::timestamp(0) FROM your_table;
如果仍然触发Assert错误,大概率是PostgreSQL旧版本的bug,建议检查版本并升级到12及以上的稳定版。
方法2:手动构造无毫秒的timestamp
如果类型转换报错,可通过提取时间字段重新构造:
SELECT make_timestamp( EXTRACT(YEAR FROM date_created)::INT, EXTRACT(MONTH FROM date_created)::INT, EXTRACT(DAY FROM date_created)::INT, EXTRACT(HOUR FROM date_created)::INT, EXTRACT(MINUTE FROM date_created)::INT, EXTRACT(SECOND FROM date_created)::NUMERIC ) FROM your_table;
该方法绕开类型转换的潜在问题,直接生成无毫秒的timestamp值。
方法3:修改字段精度(永久解决)
如果需要让字段本身不再存储毫秒,可以修改表结构:
ALTER TABLE your_table ALTER COLUMN date_created TYPE timestamp(0);
执行后,字段会自动将所有值截断到秒级,后续查询无需额外处理。
错误原因解释
- Assert错误:属于PostgreSQL旧版本的已知bug,部分低版本在处理
timestamp(0)转换时会触发断言失败,升级版本即可解决。 - to_timestamp函数不存在:
to_timestamp仅接受字符串或数值类型参数,不能直接传入timestamp,该用法本身不合法。 - date_trunc到分钟仍显示毫秒:这是PostgreSQL默认显示格式的问题,实际存储的数值已经截断到分钟,毫秒部分为0但会被默认显示,不影响实际使用。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

