Сравнение дат (хранится как строка) в базе данных 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')";

Это работает для меня.