You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在测试中重写PostgreSQL的now()函数固定返回自定义时间?

PostgreSQL测试中固定now()值的实现方案

可靠方案:临时函数覆盖+会话优先级设置

这是最稳定的本地测试方案,不会影响其他会话,且能完全控制now()的返回值:

测试初始化(固定时间)

执行以下SQL,将now()锁定为你需要的硬编码时间:

-- 创建临时函数,返回指定的固定时间
CREATE OR REPLACE FUNCTION now() RETURNS timestamptz AS $$
BEGIN
  RETURN '2027-12-31 12:00:00+00'::timestamptz;
END;
$$ LANGUAGE plpgsql VOLATILE;

-- 修改会话搜索路径,让临时函数优先于内置now()被调用
SET search_path = pg_temp, public;

验证生效

执行SELECT now();,会返回你设置的2027-12-31 12:00:00+00,整个测试会话内所有对now()的调用都会使用这个值。

测试结束后恢复

执行以下SQL恢复正常行为:

-- 重置搜索路径到默认值
RESET search_path;
-- 删除临时函数
DROP FUNCTION IF EXISTS now();

常见问题排查

你之前尝试SET/ALTER或自定义函数失效,大概率是这两个原因:

  • 自定义函数没有设置搜索路径优先级:PostgreSQL会优先调用内置函数,必须把临时函数所在的pg_temp放在搜索路径最前面
  • 临时函数的作用域问题:如果测试过程中新建了会话,临时函数不会跨会话生效,要确保所有测试逻辑都在同一个会话中执行,或者在每个测试会话初始化时重复执行上述初始化SQL

备选方案:使用事务级时间固定(适合单事务测试)

如果只需要在单个事务内固定时间,可以用SET LOCAL结合自定义函数:

BEGIN;
CREATE OR REPLACE FUNCTION now() RETURNS timestamptz AS $$
BEGIN
  RETURN '2027-12-31 12:00:00+00'::timestamptz;
END;
$$ LANGUAGE plpgsql VOLATILE;
SET LOCAL search_path = pg_temp, public;

-- 执行测试逻辑

ROLLBACK; -- 事务结束后自动恢复,无需手动删除函数

内容的提问来源于stack exchange,提问作者GA1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:57:11