我在本地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;
}
答案 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)
答案 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);