PostgreSQL创建视图后now()被转为静态时间戳如何解决?
PGAdmin4创建动态近一月数据视图的解决方法
问题原因
PostgreSQL中'now'::timestamp属于解析时求值的特殊常量字符串,会在视图创建时直接计算为当前静态时间并固化到视图定义中,PGAdmin只是展示了固化后的实际视图代码,并不是PGAdmin额外修改了你的语句。
解决方案
- 替换
'now'::timestamp写法为运行时动态求值的时间函数:
如果你需要带时区的时间戳用CURRENT_TIMESTAMP(等价于now()函数),如果productiondate字段是不带时区的timestamp类型,用LOCALTIMESTAMP即可,修改后的视图创建语句如下:CREATE OR REPLACE VIEW 你的视图名称 AS SELECT * FROM test_1 WHERE productiondate >= LOCALTIMESTAMP - '1 mon'::interval; - 优先通过SQL语句直接创建视图,不要使用PGAdmin的可视化视图编辑界面:
部分旧版本PGAdmin的可视化编辑器存在额外的时间表达式转换逻辑,直接在PGAdmin的查询工具中执行上述CREATE OR REPLACE语句,可以完全避免编辑器的额外篡改。 - 验证视图定义是否符合预期:
视图创建完成后,执行以下语句查询实际的视图定义,确认时间条件没有被转换为静态值:SELECT pg_get_viewdef('你的视图名称', true);
注意事项
不要使用'now'、'today'这类特殊字符串转换为时间戳的写法,这类写法是PostgreSQL的历史兼容语法,本身就会在语句解析阶段求值固化,不适合用于需要动态计算时间的视图、存储函数等场景。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

