PostgreSQL移除aws_oracle_ext依赖的时区设置替代方案咨询
PostgreSQL移除aws_oracle_ext扩展依赖的时区方案解答
1. aws_oracle_ext.tz的原生替代项
aws_oracle_ext.tz是AWS SCT做Oracle到PG迁移时,为了兼容Oracle会话时区逻辑自定义的配置项,PostgreSQL原生存在完全等价的内置GUC参数:TimeZone,该参数存储当前会话生效的时区,不需要依赖任何第三方扩展即可直接读取。
2. 自定义替代语句的可用性判断
你编写的如下语句无法正常实现原有逻辑:
select (CLOCK_TIMESTAMP() AT TIME ZONE COALESCE(CURRENT_SETTING(now()::text, TRUE), 'UTC'))::TIMESTAMP(0)
问题原因:
current_setting()函数的第一个入参必须是PostgreSQL内置/自定义配置项的名称,你传入的now()::text是当前时间的字符串值,根本不是合法的配置项名- 该写法执行时
current_setting()永远会返回空值,最终时区永远会回退到硬编码的UTC,完全无法读取当前会话实际设置的时区,和原代码逻辑不符。
3. 正确的原生替代写法
和原AWS扩展代码逻辑完全一致、无任何第三方扩展依赖的写法如下:
select (CLOCK_TIMESTAMP() AT TIME ZONE COALESCE(CURRENT_SETTING('TimeZone', TRUE), 'UTC'))::TIMESTAMP(0)
如果需要更简洁的等价写法,PostgreSQL原生的LOCALTIMESTAMP函数本身就实现了「返回当前会话时区下的无时区时间戳」的逻辑,直接写SELECT LOCALTIMESTAMP(0)即可得到完全相同的结果,代码更精简。
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

