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

时间:2012-01-07 11:16:07

标签: android sqlite date

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

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

我的测试数据使用: 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, 它也很奇怪,光标是null。

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

// 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;
}   

3 个答案:

答案 0 :(得分:2)

您是否尝试直接重现查询? (我的意思是使用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构造函数。以这种方式比较日期也要容易得多,而且它比String比较快得多:)

答案 1 :(得分:0)

您必须使用SQLite中的strfttime()函数格式化字符串日期。以下链接中提到了不同的格式。

http://www.sqlite.org/lang_datefunc.html

希望有所帮助

答案 2 :(得分:0)

试试这个,这里我的例子是处理完整的日期,你只能处理月份和年份

在SQLite表中提交的日期将是TEXT,日期数据应存储为“2012-12-31 00:12:00”格式,比较不会给您带来麻烦,如果我们认为字段是date_from和date_to,我们将当前日期存储在to_date然后我们应该将当前日期设置为低于和

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String to_date = sdf.format(new Date());

并且SQL查询应该是

crs = db.rawQuery(
  "SELECT _id, date_from, date_to, done_or_not, list_name " +
  "FROM list_tbl " +
  "WHERE " +
  "date_from <= Datetime('"+to_date+"') AND date_to >= Datetime('"+to_date+"')", null);