sqflite按日期范围查询报错:LEFT JOIN语法错误排查求助
问题排查与解决
核心错误原因
你的SQL语句语法顺序错误,LEFT JOIN必须放在WHERE子句之前。SQL的标准执行逻辑顺序是:FROM → JOIN → WHERE → SELECT,你把WHERE放在了JOIN前面,导致SQLite解析时触发语法错误。
修正后的查询语句
基础修正(调整语句顺序)
await db!.rawQuery('''SELECT $mealTable.id as meal_id, $mealTable.meal_name, $ordersTable.* FROM $ordersTable LEFT JOIN $mealTable ON $mealTable.id = $ordersTable.order_meal WHERE $orderCreatedAt >= '$start' AND $orderCreatedAt < '$end' ''' );
更安全的写法(参数绑定防SQL注入)
直接拼接字符串存在SQL注入风险,建议使用sqflite的参数绑定功能:
await db!.rawQuery('''SELECT $mealTable.id as meal_id, $mealTable.meal_name, $ordersTable.* FROM $ordersTable LEFT JOIN $mealTable ON $mealTable.id = $ordersTable.order_meal WHERE $orderCreatedAt >= ? AND $orderCreatedAt < ? ''', [start, end] );
日期比较逻辑说明
你的created_at存储为IsoString格式(如2023-03-27T12:34:56.789Z),start/end为yyyy-mm-dd格式,SQLite字符串按字典序比较,这种格式下>= '2023-03-27'能正确匹配当天及之后的记录,< '2023-03-28'能匹配2023-03-27的所有记录,这部分逻辑是有效的。
内容的提问来源于stack exchange,提问作者bihire boris
相关产品推荐
相关产品推荐

