Как задать в rawQuery выборку из временного интервала

248
16 июля 2017, 10:51

Использую ORMLite c SQLite. Надо задать выборку данных по заданному интервалу для поля типа Date. Создаю 4 даты:

        DateTime dateTime1 = DateTime.parse("2016-01-01", DateTimeFormat.forPattern("yyyy-MM-dd"));
    DateTime dateTime2 = DateTime.parse("2016-02-01", DateTimeFormat.forPattern("yyyy-MM-dd"));
    DateTime dateTime3 = DateTime.parse("2016-03-01", DateTimeFormat.forPattern("yyyy-MM-dd"));
    DateTime dateTime4 = DateTime.parse("2016-04-01", DateTimeFormat.forPattern("yyyy-MM-dd"));
    thirdLatestDate = dateTime1.toDate();
    secondLatestDate = dateTime2.toDate();
    latestDate = dateTime3.toDate();
    nextDate = dateTime4.toDate();

Создаю по одному элементу с каждой из дат и записываю в БД. Проверяю, что все 4 лежат там. Затем пытаюсь сделать выборку с интервалом:

         EventOrmModel.COLUMN_NAME_DATE + " BETWEEN '" +
                 dateFormat.format(startDate) + "' AND '" + dateFormat.format(endDate)

если startDate null, то условие BETWEEN не добавляется и я получаю все 4 элемента, но если я ставлю даты, то все время получаю на 1 элемент меньше, чем должно быть. Причем это даже не зависит от того, равна ли endDate дате последнего элемента или на месяц больше. Я все время недополучаю последний элемент, подходящий под интервал. Например, я задаю даты так: startDate равна дате самого раннего элемента, а endDate больше, чем последняя. Я получаю 3 элемента вместо 4-х. D Как правильно задать звпрос? Кстати, тот же результат получается, если вместо between я использую условия больше startDate и меньше endDate.

dateFormat вот такой:

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

После новой серии тестов выяснилось, что не хватает все-таки первого элемента, то есть с самой ранней датой. Может быть, что between берет не ">=", а только ">" ?

Answer 1

Оказалось, что Between использует для начала интервала условие ">"б для конца "<=". Странно, но так оно почему-то работает. Если нужно получить также данные, дата которых равна нижней границе, достаточноНадо провести такую операцию с датой:

dateFormat.format(new Date(startDate.getTime() -1))
READ ALSO
Объясните принцип работы Interface в java

Объясните принцип работы Interface в java

Добрый деньЕсть интерфейс, например

298
Долгий процесс Java EE

Долгий процесс Java EE

Есть сайтЕсть процесс который может занять долгое время

241
Проблемный многопоточный код

Проблемный многопоточный код

У меня есть такой участок кода:

207