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

Python(sqlite3):删除SQL数据库一周前旧数据并保留每小时最后一条记录

清理旧数据:保留每小时最后一条记录的修正方案

你的需求是对超过一周的旧数据执行清理,仅保留每个小时的最后一条记录,删除其余数据。原代码存在几处逻辑和语法问题,以下是修正方案:

原代码的问题点

  • 日期未加单引号:SQL中日期字符串必须用单引号包裹,2022-07-11要写成'2022-07-11'
  • 取极值方向错误:要留每小时最后一条,得用MAX(time)而不是MIN(time)——MIN会取每小时最早的记录,和需求相反
  • 分组维度不全:只按hour(time)分组会把不同日期的同一小时数据混在一起,必须加上date(time)分组,确保每天的每个小时单独处理
  • 子查询未过滤时间:子查询没限定只处理旧数据,会把所有时间的小时极值都算进来,可能导致逻辑混乱

修正后的可运行代码

import sqlite3
from datetime import datetime, timedelta

# 动态计算一周前的时间,不用硬写日期
one_week_ago = (datetime.now() - timedelta(weeks=1)).strftime('%Y-%m-%d %H:%M:%S')

# 建立数据库连接(替换成你的数据库路径)
db = sqlite3.connect('your_db.db')
c = db.cursor()

# 修正后的删除语句
c.execute('''
DELETE FROM TICKER_AAPL 
WHERE time < ? 
  AND time NOT IN (
    SELECT max_time FROM (
      SELECT MAX(time) AS max_time 
      FROM TICKER_AAPL 
      WHERE time < ? 
      GROUP BY date(time), hour(time)
    ) AS temp_tab
  );
''', (one_week_ago, one_week_ago))

# 提交事务并关闭连接
db.commit()
db.close()

关键逻辑说明

  • 用datetime动态计算一周前的时间,比硬编码日期更灵活,适配不同场景
  • 子查询里也加了time < ?的过滤,确保只针对旧数据筛选每小时的最后一条
  • GROUP BY date(time), hour(time)保证每天的每个小时独立筛选,不会跨天混淆
  • 使用参数化查询?,既避免SQL注入风险,又能正确适配SQLite的日期格式

附表示例:
Table example

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:15:36