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的日期格式
附表示例:
内容的提问来源于stack exchange,提问作者FelixFelixFelix
相关产品推荐
相关产品推荐

