Проблема запроса даты SQLite Android, не может сравнить записи между 2 датами - PullRequest
1 голос
/ 07 января 2012

Я сталкиваюсь с огромными проблемами с выполнением запросов, связанных с датами, в локальной базе данных SQLite, пожалуйста, оцените вашу помощь по этому вопросу!

Я пытаюсь получить все события, у которых есть дата события в течение данного года и месяца,Для этого я вычислил первую дату и последнюю дату этого месяца, а затем запросил, где дата события находится в этом диапазоне.

В моих тестовых данных используется: 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, он также работает странно, курсор нулевойвместо этого. </p>

Пожалуйста, помогите мне, если у вас есть какие-либо подсказки об этом!

// 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;
}   

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Вы пытались воспроизвести запрос напрямую? (Я имею в виду запросы к базе данных с помощью некоторых инструментов, таких как 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:)

0 голосов
/ 31 декабря 2012

попробуйте это, здесь мой пример имеет дело с полной датой, где вы можете иметь дело только с месяцем и годом

Дата, хранящаяся в таблице 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);
0 голосов
/ 07 января 2012

Вы должны отформатировать строковую дату с помощью функции strfttime () в SQLite. Различные форматы упомянуты в следующей ссылке.

http://www.sqlite.org/lang_datefunc.html

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...