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

如何在PostgreSQL中获取指定日期(当月)的API请求计数?

实现PostgreSQL当月API请求计数统计

首先你的建表语句存在语法错误,counter字段定义后缺少逗号,正确的建表语句应为:

CREATE TABLE IF NOT EXISTS Admin (
        id SERIAL PRIMARY KEY,
        counter INTEGER NOT NULL DEFAULT 0,
        created_date TIMESTAMP NOT NULL DEFAULT Now()
);

以下分场景给出实现方案:

场景1:每条记录对应一次API请求(推荐设计)

如果你的逻辑是每次API请求插入一条新的Admin记录(counter设为1代表单次请求),直接统计当月的记录总数即可:

SELECT COUNT(*) AS monthly_request_count
FROM Admin
WHERE created_date >= DATE_TRUNC('month', CURRENT_DATE)
  AND created_date < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month';

DATE_TRUNC('month', CURRENT_DATE)会获取当月第一天的0点时间,加上1个月后就是下月第一天,能精准筛选出当月所有记录。

场景2:单条记录累加counter统计总请求数

如果你的逻辑是用单条Admin记录的counter字段累加所有请求次数(每次请求执行UPDATE Admin SET counter = counter +1 WHERE id = ?),原表设计无法直接统计当月请求数——因为created_date只记录记录创建时间,不会随更新同步。

这种情况下需要先修改表结构,添加记录更新时间的字段:

ALTER TABLE Admin ADD COLUMN updated_date TIMESTAMP NOT NULL DEFAULT NOW();

之后每次更新counter时同步更新updated_date:

UPDATE Admin 
SET counter = counter + 1, updated_date = NOW() 
WHERE id = 1; -- 替换为你的目标记录ID

再通过对比当月初和当前的counter值,计算当月请求数:

WITH last_month_end_counter AS (
    -- 获取上月末最后一次更新的counter值
    SELECT counter
    FROM Admin
    WHERE id = 1
      AND updated_date < DATE_TRUNC('month', CURRENT_DATE)
    ORDER BY updated_date DESC
    LIMIT 1
),
current_counter AS (
    -- 获取当前counter值
    SELECT counter
    FROM Admin
    WHERE id = 1
)
SELECT 
    COALESCE(current.counter - last_month.counter, current.counter) AS monthly_request_count
FROM current_counter current
LEFT JOIN last_month_end_counter last_month ON true;

更合理的优化方案

用单条记录累加请求数的设计不利于后续多维度统计(比如按天、按用户统计),更推荐单独创建请求日志表:

CREATE TABLE IF NOT EXISTS api_request_logs (
    id SERIAL PRIMARY KEY,
    admin_id INTEGER REFERENCES Admin(id), -- 关联管理员表
    request_time TIMESTAMP NOT NULL DEFAULT NOW()
);

每次API请求时插入一条日志记录:

INSERT INTO api_request_logs (admin_id) VALUES (1); -- 替换为对应管理员ID

统计当月请求数的SQL会更简洁直观:

SELECT COUNT(*) AS monthly_request_count
FROM api_request_logs
WHERE request_time >= DATE_TRUNC('month', CURRENT_DATE)
  AND request_time < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:36:16