我在本地 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/