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

健身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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:38:37