健身APP中获取当月及上月训练数据的SQL查询函数修复需求
健身APP月度训练数据查询问题修复
现有问题
当前实现的getThisMonthItems和getLastMonthItems存在明显错误:
getThisMonthItems的SQL语句逻辑错误,当前查询的是一个月前及更早的数据,完全不符合"当月数据"的需求;getLastMonthItems不仅函数名拼写错误(应为getLastMonthItems),SQL语句还在查询当天数据,和"上月数据"的需求完全不符。
表结构回顾
你的训练组数据表结构如下:
static Future<void> createTables(sql.Database database) async { await database.execute("""CREATE TABLE sets( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, exercise_name TEXT, total_weight TEXT, total_reps TEXT, date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_favorite INTEGER ) """); }
注意:date字段为TIMESTAMP类型,SQLite会自动以YYYY-MM-DD HH:MM:SS格式存储,我们可以利用SQLite的日期函数精准筛选月度数据。
修正后的函数实现
以下是正确获取当月、上月数据的函数代码:
获取当月数据
static Future<List<Map<String, dynamic>>> getThisMonthItems() async { final db = await SQLHelper.db(); // 筛选日期属于当前月份的记录 return db.rawQuery(''' SELECT * FROM sets WHERE strftime('%Y-%m', date) = strftime('%Y-%m', 'now') '''); }
逻辑说明:通过strftime函数提取日期的"年-月"部分,匹配当前月份的所有记录。
获取上月数据
static Future<List<Map<String, dynamic>>> getLastMonthItems() async { final db = await SQLHelper.db(); // 筛选日期属于上个月的记录 return db.rawQuery(''' SELECT * FROM sets WHERE strftime('%Y-%m', date) = strftime('%Y-%m', 'now', '-1 month') '''); }
逻辑说明:通过strftime('%Y-%m', 'now', '-1 month')获取上个月的"年-月"标识,匹配对应月份的所有记录。
补充说明
如果需要更精确的时间范围(比如当月第一天0点到当月最后一天23:59:59),也可以使用以下SQL写法:
- 当月数据:
SELECT * FROM sets WHERE date >= DATE('now', 'start of month') AND date < DATE('now', 'start of month', '+1 month')
- 上月数据:
SELECT * FROM sets WHERE date >= DATE('now', 'start of month', '-1 month') AND date < DATE('now', 'start of month')
内容的提问来源于stack exchange,提问作者user21233522
相关产品推荐
相关产品推荐

