SQLite - проблема с форматом DateTime при запросе любой строки, сравнивающей DateTime в предложении WHERE - PullRequest
2 голосов
/ 30 марта 2019

Допустим, у меня есть база данных, которая включает в себя такую ​​таблицу:
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 Ответ

1 голос
/ 30 марта 2019

при прохождении

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, обрабатывается как строковый литерал и будет фактически заключено в одинарные кавычки в операторе, который будет выполнен.

Вы можете прочитать больше здесь .

...