以日期方式从 sql 数据库中获取数据?

问题描述

我正在 Flutter 中制作一个应用程序,我正在使用 sqflite 插件实现 sql 数据库在这个应用程序中,用户可以通过填写下面的表格来创建交易

form

然后用户可以验证他们的交易,如果他们犯了错误,他们也可以选择编辑交易

viewscreen

现在我想添加一个功能,通过该功能,他们可以在下面的屏幕上获得他们在特定月份完成的费用总和

monthwise

显示为空,但应该显示费用的总和

我的查询代码

Future getDataJan() async{
final db = await database;
sumJan=await db.rawQuery(
    'SELECT SUM(AMOUNT) FROM EXPENSES WHERE DATE(DATETIME) >= ? AND DATE(DATETIME) <= ?',[2021-01-01,2021-01-31] ).then(Sqflite.firstIntValue);
print(sumJan);
finalJan=sumJan.toString();
}

数据库创建:

Future<Database> createDatabase() async {
String dbPath = await getDatabasesPath();

return await openDatabase(
  join(dbPath,'expenseDB.db'),version: 1,onCreate: (Database database,int version) async {
    print("Creating expense table");

    await database.execute(
      "CREATE TABLE $TABLE_EXPENSES ("
      "$COLUMN_ID INTEGER PRIMARY KEY,"
      "$COLUMN_NAME TEXT,"
      "$COLUMN_AMOUNT INTEGER,"
      "$COLUMN_UNNECESSARYEXPENSES INTEGER,"
      "$COLUMN_CATEGORY TEXT,"
      "$COLUMN_DATETIME TEXT"
      ")",);
  },);
}

映射数据库(我认为它不工作,因为映射时的字符串):

Map<String,dynamic> toMap() {
var map = <String,dynamic>{
  DatabaseProvider.COLUMN_NAME: name,DatabaseProvider.COLUMN_AMOUNT: amount,DatabaseProvider.COLUMN_UNNECESSARYEXPENSES: isUnnecessaryExpenses ? 1 : 0,DatabaseProvider.COLUMN_CATEGORY: category,DatabaseProvider.COLUMN_DATETIME: pickedDate,};

if (id != null) {
  map[DatabaseProvider.COLUMN_ID] = id;
}

return map;
}

数据库条目:

databaseEntry

编辑: 这是我创建一个用于调用日期选择的小部件的代码

  Widget DatePicker() {

   showDatePicker(context: context,initialDate: DateTime.Now(),firstDate: DateTime.parse("2020-01-01 00:00:01Z"),lastDate: DateTime.Now()
  ).then((value){
    if (value == null){
      return;
     }
     _dateTime = value;
     ////saving in string
     pickedDate = DateFormat('yyyy-MM-dd').format(_dateTime);
     });
   }

在有问题的家伙建议后给出的错误

lib/db/database_provider.dart:111:59: Error: Expected ',' before this.
  'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m',date(datetime)) ==   01').then(Sqflite.firstIntValue);
                                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
    lib/db/database_provider.dart:111:58: Error: The getter 'm' isn't defined  for the class 'DatabaseProvider'.
    - 'DatabaseProvider' is from 'package:finance_manager/db /database_provider.dart' ('lib/db/database_provider.dart').
    Try correcting the name to the name of an existing getter,or defining a   getter or field named 'm'.
  'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m',date(datetime)) == 01').then(Sqflite.firstIntValue);
                                                     ^
   lib/db/database_provider.dart:111:57: Error: The operator '%' isn't defined for the class 'String'.
   Try correcting the operator to an existing operator,or defining a '%' operator.
  'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m',date(datetime)) ==   01').then(Sqflite.firstIntValue);
                                                    ^
  lib/db/database_provider.dart:111:59: Error: The argument type 'String' can't be assigned to the parameter type 'List<dynamic>'.
- 'List' is from 'dart:core'.
     'SELECT SUM(AMOUNT) FROM EXPENSES WHERE strftime('%m',date(datetime)) == 01').then(Sqflite.firstIntValue);

更新

我在 android studio 中使用数据库检查器打开数据库并尝试在其中运行以下查询

SELECT SUM(AMOUNT) FROM EXPENSES

SELECT SUM(AMOUNT) FROM EXPENSES WHERE DATE(DATETIME) >= 2021-01-01 and  DATE(DATETIME) <= 2021-01-31 

上述查询工作正常并返回列金额的总和,但是一旦我运行第二个查询,它再次给我空值,我想我保存了错误的日期方式。

请帮忙。

感谢您的回复

解决方法

您的函数缺少日期周围的引号

Future getDataJan() async{
final db = await database;
sumJan=await db.rawQuery(
    'SELECT SUM(AMOUNT) FROM EXPENSES WHERE DATE(DATETIME) >= ? AND DATE(DATETIME) <= ?',['2021-01-01','2021-01-31'] ).then(Sqflite.firstIntValue);
print(sumJan);
finalJan=sumJan.toString();
}