Сравнение дат (хранится как строка) в базе данных android sqlite?
Я храню даты как String
в моей базе данных в этом формате:
YYYY-MM-DD HH:MM:SS
который является одним из поддерживаемых форматов (http://www.sqlite.org/lang_datefunc.html). Теперь я хочу сравнить эти сохраненные даты (ну, строки) с другими датами. Мои даты хранятся в столбце column_date
, поэтому я пытаюсь это сделать:
SELECT * FROM MyTable
WHERE
(Date(column_date) >= Date (2000-01-01) AND Datetime(column_date) <= Datetime (2050-01-01))
Как я прочитал документацию, The date and time functions use a subset of IS0-8601 date and time formats. The date() function returns the date in this format: YYYY-MM-DD.
, поэтому, я полагаю, я делаю это правильно - я создаю дату из сохраненной строки и сравниваю ее с датой, созданной из других строк.
Но это не работает, даже когда column_date
является датой с этого года, и поскольку вы можете видеть, что даты начала и окончания очень доброжелательны. Пробовал также это (используется дата-время вместо даты):
SELECT * FROM MyTable
WHERE
(datetime(column_date) >= Date (2000-01-01) AND datetime(column_date) <= Datetime (2050-01-01))
и это (используйте между вместо <= и > =)
SELECT * FROM MyTable
WHERE
(Date(column_date) between Date (2000-01-01) AND Datetime (2050-01-01))
и всех других возможных комбинаций. Что, черт возьми, я делаю не так, я глуп, или документальная ложь, или я пропустил что-то очень важное? Попытка найти решение несколько часов, но ничего не работает...
Ответы
Ответ 1
если вы сохраняете даты как строки в формате
YYYY-MM-DD HH:mm:ss
==== > то ваше поле даты является типом данных DateTime
Таким образом, вы должны использовать такой запрос
select *
from MyTable
where mydate >= Datetime('2000-01-01 00:00:00')
and mydate <= Datetime('2050-01-01 23:00:59')
вы также можете использовать фрагмент, указанный @Joop Eggen, с th между оператором, который он имеет тот же самый подход.
Оператор BETWEEN логически эквивалентен паре сравнений. "x МЕЖДУ y И z" эквивалентно "x >= y AND x <= z" , за исключением того, что с BETWEEN выражение x оценивается только один раз. см. sqlite3 docs
Ответ 2
SELECT *
FROM MyTable
WHERE
column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59'
Должен сделать трюк. Это использует только строки, но вы сказали, что это будет подходящим.
Ошибка была отсутствующей частью времени или не выполнялась только субстрат только в части даты. И тогда функции преобразования данных/времени могут также давать неправильные вещи.
Ответ 3
Я думаю, что ваша проблема здесь...
AND Datetime(column_date) <= Datetime (2050-01-01))
Почему вы используете Datetime здесь вместо Date?
Попробуйте следующее:
SELECT * FROM MyTable WHERE (Date(column_date) >= Date (2000-01-01) AND Date(column_date) <= Date (2050-01-01))
Ответ 4
Дата, поданная в таблице 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);
Ответ 5
Сравнение дат (хранится как строка) в базе данных Androidite SQLite. Используйте дату в формате 12/07/2015
и используйте такой запрос:
SELECT * FROM tableName WHERE Date >=('12/07/2015') and appointmentDate <('13/07/2015')";
Это работает для меня.