Android SQLite 日期查询问题,无法比较 2 个日期之间的记录

标签 android sqlite date

我在本地 SQLite 数据库上运行与日期相关的查询时遇到了很大的问题,非常感谢您的帮助!

我正在尝试检索事件日期在给定年份和月份内的所有事件。为此,我计算了该月的第一个日期和最后一个日期,然后查询事件日期在此范围内的位置。

我的测试数据使用: String[] testEventDates = {"2011-12-17", "2012-02-25", "2012-01-10", "2012-01-01", "2011-12-24","2012-02-25"

但是当我运行下面的查询时,我检索到了所有这些条目,这是错误的。我的查询是,(SELECT...WHERE) "eventDate >= "+ firstDay。

当我添加另一个限制时,"AND "eventDate < "+ lastDay, 它也很奇怪,光标为空。

如果您对此有任何线索,请帮助我!

// fetch events by month, between first and last days calculated
public Cursor fetchEventsByMonth(int month, int year) {
    String firstDay, lastDay, correctedMonth;

    if (month == 12) {
        lastDay = Integer.toString(year+1) + "-01-01";
    } else{
        if (month+1 < 10) {
            correctedMonth = "0" + Integer.toString(month+1);
            } else correctedMonth = Integer.toString(month+1);
        lastDay = Integer.toString(year) + "-" + correctedMonth
                + "-01";
    }
    if (month < 10) {
        correctedMonth = "0" + Integer.toString(month);
        } else correctedMonth = Integer.toString(month);
    firstDay = Integer.toString(year) + "-" + correctedMonth + "-01";
    firstDay = "2012-02-25";

    Cursor mCursor =
    mDb.query(DATABASE_TABLE_EVENTS, new String[] { KEY_EID, KEY_ENAME,
            KEY_EINTERESTS, KEY_EBENS, KEY_EDATE, KEY_ETIME, KEY_EVHO, KEY_EABBR,
            KEY_ELOCATION, KEY_ETYPE, KEY_ENATURE, KEY_ESTATUS, 
            KEY_ESIGNEDUP, KEY_ECAPACITY}, "eventDate >= " + firstDay
            // + " AND "eventDate < " + lastDay
                    , null, null, null,
            "eventDate");
    if (mCursor != null) mCursor.moveToFirst();

    return mCursor;
}   

最佳答案

您是否尝试过直接重现查询? (我的意思是使用 SQLite Manager 等工具查询数据库)。

注意:当您使用 STRINGS 时,您必须始终使用单引号! 我还修改了它以使用选择和选择参数,因此您的安全性更高,并且它会自动插入单引号。尝试一下 所以你的查询必须是:

Cursor mCursor =
    mDb.query(DATABASE_TABLE_EVENTS, new String[] { KEY_EID, KEY_ENAME,
            KEY_EINTERESTS, KEY_EBENS, KEY_EDATE, KEY_ETIME, KEY_EVHO, KEY_EABBR,
            KEY_ELOCATION, KEY_ETYPE, KEY_ENATURE, KEY_ESTATUS, 
            KEY_ESIGNEDUP, KEY_ECAPACITY}, "eventDate >= ? AND eventDate < ?"
                    , new String[] { firstDay, lastDay}, null, null,
            "eventDate");
    if (mCursor != null) mCursor.moveToFirst();

还有一个非常重要的建议是永远不要用字符串存储日期和时间。首先,因为它们以这种方式是静态的,相反你必须认为人们生活在不同的国家和不同的时间和时区,所以你必须以全局的方式思考 :)

存储日期和时间的最佳方式(在我看来)是使用长(时间戳)。 因此,当您检索日期/时间时,您可以将其直接传递给 Date 构造函数或 Calendar 构造函数。此外,以这种方式比较日期要容易得多,而且它确实比字符串比较快得多:)

关于Android SQLite 日期查询问题,无法比较 2 个日期之间的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769240/

相关文章:

Android 图像在设备旋转之前不会出现

android - Firebase 存储的上传/下载速度非常慢

ios - 如何在 Swift 3 上修复 'No such module SQLite'

mysql - 用专业数据库替换核心数据以提高性能

java - 无法验证集成测试用例中的日期类型

android - 为什么 android studio 在应用文件模板后进行 gradle 同步?

android - 如何在新的 NavigationView 中创建一个简单的分隔线?

android - 在预创建的 SQLite 数据库上从 android 应用程序文件夹存储和检索图像路径并将图像设置为 ImageView

Django 表单 "Enter a valid date."

c - 我如何在 C 中打印日期?