在 SQLite 中使用 Between 不返回每周数据

Posted

技术标签:

【中文标题】在 SQLite 中使用 Between 不返回每周数据【英文标题】:Weekly Data is not Returned using Between in SQLite 【发布时间】:2018-12-03 04:00:35 【问题描述】:
 @Override
public void onCreate(SQLiteDatabase db) 
    this.db = db;
    db.execSQL(
            "CREATE TABLE `Transaction` (" +
            "_id integer primary key autoincrement," +
            "`categoryID` INT NOT NULL , " +
            "`incomeAmount` INT NOT NULL, " +
            "`expenseAmount` INT NOT NULL, " +
            "`note` VARCHAR(50) NOT NULL , " +
            "`transactionDate` INT NOT NULL, " +
            "`repeatType` INT NOT NULL  , " +
            "`transactionType` BOOLEAN NOT NULL )"
    );

public Cursor readDatabaseTransactionWeekly(Date date)
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);
    cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());

    Date startWeek = cal.getTime();
    Calendar nextWeelCal = Calendar.getInstance();
    nextWeelCal.setTime(cal.getTime());
    nextWeelCal.add(Calendar.WEEK_OF_MONTH,1);
    Date nextWeek = nextWeelCal.getTime();
    Log.d(TAG, "readDatabaseTransactionWeekly: "+startWeek+" to "+nextWeek+"");
    this.db = getReadableDatabase();
    Cursor transactionRecordWeekly = this.db.rawQuery("SELECT * FROM `Transaction` WHERE transactionDate BETWEEN '"+startWeek+"' AND '"+nextWeek+"'",null);
    transactionRecordWeekly.moveToFirst();
    return transactionRecordWeekly;


public Cursor readDatabaseTransactionMonthly(Date date)
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    Date startMonth = cal.getTime();
    Calendar nextMonthCal = Calendar.getInstance();
    nextMonthCal.setTime(cal.getTime());
    nextMonthCal.add(Calendar.MONTH,1);
    Date nextMonth = nextMonthCal.getTime();
    this.db = getReadableDatabase();
    Cursor transactionRecordMonthly = this.db.rawQuery("SELECT * FROM `Transaction` WHERE transactionDate BETWEEN '"+startMonth+"' AND '"+nextMonth+"'",null);
    transactionRecordMonthly.moveToFirst();
    return transactionRecordMonthly;

我正在尝试每周和每月从 Andoroid 中的 SQLite 读取数据,并且我正在使用 SQLite BETWEEN 语句。但它没有按预期工作。每周部分根本不返回任何数据,而每月正常工作不显示当前一周的数据。我查看了其他 4 个 *** 问题,但无法解决。

【问题讨论】:

【参考方案1】:

我认为 Calendar.WEEK_OF_MONTH 没有达到您的预期。 请尝试添加 7 天。

【讨论】:

尝试在 Calender.DAY_OF_Month 中添加 7 天,但没有再次输出。 无论如何,这是 Calender.WEEK_OF_Month 一周的开始和结束日期,看起来不错。 2018 年 6 月 24 日星期日 00:00:00 GMT+05:00 至 2018 年 7 月 1 日星期日 00:00:00 GMT+05:00 2018【参考方案2】:

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); 将日期设置为 6 月 18 日星期一

【讨论】:

之前也试过。但它的应用程序意外停止并显示此错误。原因:SQL(查询)错误或缺少数据库。 (在“Jun”附近:语法错误(代码 1):,编译时:SELECT * FROM Transaction WHERE transactionDate BETWEEN Sun Jun 24 00:00:00 GMT+05:00 2018 AND Sun Jul 01 00:00:00 GMT +05:00 2018) 在哪里? nextWeelCal.setTime(cal.getTimeInMillis());我在这里更改了它,但 IDE 显示错误,因为 nextWeek 是日期类型。 再次没有输出。我将 startWeek 和 nextWeek 更改为 long。但还是一无所获。 :-( 将 transactionDate 更改为 DATE 也不起作用。 你能提供一些关于如何在数据库中存储日期的代码吗?【参考方案3】:

我将“transactionDate”字段的类型更改为“long”,然后通过以毫秒为单位转换日期将日期插入数据库。这是对我有用的解决方案,也许它不是一个好的解决方案,但它确实有效。我发布它可能对其他人有帮助。

【讨论】:

以上是关于在 SQLite 中使用 Between 不返回每周数据的主要内容,如果未能解决你的问题,请参考以下文章

目标 C,SQLite SELECT BETWEEN 问题

SQLite:仅返回每组中的前 2 个结果

SQLite BETWEEN 日期错误

MYSQL 查询不返回 BETWEEN 的结果,但它返回小于和等于子查询的结果

距离Between()返回不准确的结果?

在 sqlite 表中插入的记录对于每一行都是相同的