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

Postgres中如何比较timestamp与整数?授权码过期触发器报错如何解决

错误原因

两个timestamptz类型的时间做减法得到的是interval(时间间隔)类型,不能直接和整数600做比较,这是报错的直接原因。

修改方案

你只需要调整remove_expired函数里的删除条件,将整数转为对应的时间间隔类型即可,推荐直接使用可读性更强的时间间隔声明写法,修改后完整代码如下:

drop table if exists authorization_code;
create table if not exists authorization_code(
    id int generated always as identity,
    created_at timestamptz not null
);

drop function if exists remove_expired();
create function remove_expired() 
   returns trigger 
   language plpgsql
as $$
begin
    --NOTE 10 mins as recommended by the OAuth2 spec
    -- 写法1:直接用时间间隔字面量,可读性最高
    delete from authorization_code where created_at < now() - interval '10 minutes';
    -- 等价写法参考:
    -- delete from authorization_code where now() - created_at > interval '10 minutes';
    -- 偏好按秒计算也可以写:delete from authorization_code where now() - created_at > 600 * interval '1 second';
    return NEW;
end;
$$;

drop trigger if exists clean_up_expired_code on authorization_code;
create trigger clean_up_expired_code
  before insert
  on authorization_code
  for each row
  execute procedure remove_expired();

额外优化提示

上面示例中选择created_at < now() - interval '10 minutes'的写法,后续如果给created_at字段加索引的话,这条删除语句可以命中索引,执行效率会比做时间差值比较的写法更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:18:01