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

SQLite按天统计记录数 包含无记录0值日期的实现方法

解决方法

SQLite没有内置生成连续日期序列的函数,要拿到指定区间全量连续日期的统计值(无记录日期显示0),核心逻辑是先构造目标时间范围内的连续日期全集,再左关联业务表做计数,两种常用实现如下:

纯SQL实现(固定统计范围适用)

用递归CTE生成连续日期,再做左连接统计。注意行业过滤条件必须放在JOIN关联段,不能放WHERE段,否则会把0值行过滤掉:

WITH RECURSIVE date_series AS (
    SELECT '2022-04-01' AS date -- 替换为你的统计开始日期
    UNION ALL
    SELECT date(date, '+1 day')
    FROM date_series
    WHERE date < '2022-04-30' -- 替换为你的统计结束日期
)
SELECT
    ds.date,
    COUNT(mt.id) AS num_records
FROM date_series ds
LEFT JOIN mytable mt
    ON ds.date = mt.date
    AND mt.industry = 'construction'
GROUP BY ds.date
ORDER BY ds.date ASC;

运行后会返回指定区间内所有日期的结果,比如你举例的场景里,2022-04-02、2022-04-03这类无记录的日期都会显示num_records为0。

Python配合实现(动态范围/适配现有脚本适用)

你本身已经用Python做数据库定期更新,这种方式更灵活,不需要每次修改SQL里的硬编码日期:

  • 用Python的datetime模块生成目标统计区间的连续日期列表
  • 执行原有SQL拿到有记录日期的统计结果,存为「日期为键、计数为值」的字典
  • 遍历连续日期列表,字典里不存在的日期直接补0,最终结果可以直接传给图表绘制模块使用

参考代码:

import sqlite3
from datetime import datetime, timedelta

# 按需修改统计配置
START_DATE = datetime(2022, 4, 1)
END_DATE = datetime(2022, 4, 30)
TARGET_INDUSTRY = "construction"
DB_FILE_PATH = "your_database.db"

# 生成连续日期序列
date_sequence = []
current = START_DATE
while current <= END_DATE:
    date_sequence.append(current.strftime("%Y-%m-%d"))
    current += timedelta(days=1)

# 查询已有记录的统计结果
conn = sqlite3.connect(DB_FILE_PATH)
cursor = conn.cursor()
cursor.execute(
    "SELECT date, COUNT(id) FROM mytable WHERE industry = ? GROUP BY date",
    (TARGET_INDUSTRY,)
)
record_map = {date_str: count for date_str, count in cursor.fetchall()}
conn.close()

# 组装带0值的全量统计结果
full_statistics = [
    {"date": d, "num_records": record_map.get(d, 0)} 
    for d in date_sequence
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:48:19