SQLite-查询将DateTime与WHERE子句进行比较的任何行时,DateTime格式存在问题

时间:2019-03-30 09:05:00

标签: android sqlite android-sqlite

假设我有一个数据库,其中包括一个这样的表:
CREATE TABLE tbl_EX (_id TEXT, TIME TEXT);
然后我插入一个像这样的值:

Date currentTime = Calendar.getInstance(Locale.getDefault()).getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String time = dateFormat.format(currentTime);
ContentValues contentValues = new ContentValues();
contentValues.put("_id", "SomeID");
contentValues.put("TIME", time);
database.insert("tbl_EX", null, contentValues);

之后,我尝试查询。没有WHERE子句:

database.query("tbl_EX", new String[]{"_id", "TIME"}, null, null, null, null, "TIME");

它按预期检索了我所有的记录,这些记录显示在2个TextView中,如下所示:

_id = SomeID | Time = 2019-03-30 15:00:00

但是,当我使用此WHERE子句进行查询时:

database.query("tbl_EX", new String[]{"_id", "TIME"}, "date(TIME) = ?", new String[]{"date('now')"}, null, null, "TIME");

未找到数据!我什至尝试将部分new String[]{"date('now')"}替换为
new String[]{"date('2019-03-30')"}
new String[]{"strftime('%Y-%m-%d', 'now')"}或什至
new String[]{"'2019-03-30'"},仍然无法使用。

那么,我是否以正确的方式将DateTime数据存储在SQLite数据库中?并以正确的方式查询它?

1 个答案:

答案 0 :(得分:1)

通过时

new String[]{"date('now')"}

作为参数,将被翻译为以下查询:

select _id, TIME from tbl_EX where date(TIME) = 'date('now')'

您能看到问题吗?
date('now')被视为WHERE子句的字符串参数,因此您的查询在列date('now')中搜索文字TIME
相反,您应该做的是:

database.query("tbl_EX", new String[]{"_id", "TIME"}, "date(TIME) = date(?)", new String[]{"now"}, null, null, "TIME");

这样,将传递参数now,您的查询将是:

select _id, TIME from tbl_EX where date(TIME) = date('now')

类似地,当您要过滤2019-03-30之类的特定日期时,必须执行以下操作:

database.query("tbl_EX", new String[]{"_id", "TIME"}, "date(TIME) = ?", new String[]{"2019-03-30"}, null, null, "TIME");

因此,您传递的2019-03-30中没有单引号。

您在selectionArgs参数中包含的所有内容均被视为String文字,并且实际上将在将要执行的语句中用单引号引起来

您可以阅读更多here