Как запросить базу данных SQLite, чтобы вернуть все даты / время между 2 указанными c датами / временем, которые вставляются в виде миллисекунд? - PullRequest
0 голосов
/ 12 января 2020

У меня есть база данных SQLite с 4 столбцами. Я вставил значения даты / времени в COLUMN_DATE в виде миллисекунд с помощью метода «System.currentTimeMillis ()», и я хочу запросить базу данных SQLite, чтобы получить все строки между 2 указанными c датами, также представленными в миллисекундах. Этот запрос должен также включать строки с этими 2 указанными c датами.

Вот моя база данных SQLite:

public static final String CREATE_SQL = "create table " + TABLE_NAME + "(" + COLUMN_ID + " integer primary key autoincrement, " +
        COLUMN_DATE + " integer not null, " + COLUMN_STATUS + " text not null, " + COLUMN_TOTAL + " text not null);";

А вот база данных со вставленными значениями:

enter image description here

Я хочу запросить базу данных SQLite по 1578530800000 (ID = 2) в качестве даты начала и 1578698202000 (ID = 5) в качестве даты окончания и получить все строки между эти указанные c даты, включая сами эти даты. Значит, я хочу, чтобы в результате таблица была помечена красным прямоугольником.

Я пытался выполнить запрос к базе данных, но так и не получил то, что ожидал. Вот мой пример запроса:

String[] projection = {Wdatabase.COLUMN_ID, Wdatabase.COLUMN_DATE, Wdatabase.COLUMN_STATUS, Wdatabase.COLUMN_TOTAL};
String selection = Wdatabase.COLUMN_DATE + " >= " + startDate + " AND " + Wdatabase.COLUMN_DATE +" <= " + endDate;

Cursor r = Objects.requireNonNull(getActivity()).getContentResolver().query(DbProvider.CONTENT_URI, projection, selection, null, null, null);

Может кто-нибудь объяснить мне, что здесь не так?

Вот мой курсор с журналами:

while (r.moveToNext()) {

        Log.i("Arguments", "CursorId: " + r.getInt(0));
        Log.i("Arguments", "CursorDate: " + r.getLong(1));
        Log.i("Arguments", "CursorStatus: " + r.getString(2));
        Log.i("Arguments", "CursorTotal: " + r.getString(3));

    }

Ответы [ 2 ]

1 голос
/ 12 января 2020

Согласно вашему комментарию Чт 9 января 2020 г. 00:00:00 (1578524400000) до пт 10 января 2020 г. 00: 00: 00

Тогда вы не ожидаете получить ID 5 так как пт 10 января 2020 23:16:42 это та же дата НО позднее .

Так что если вы хотите получить все строки от даты к дате, игнорируя время, тогда вы может использовать то, что равно: -

SELECT COLUMN_ID,COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL FROM thetable WHERE date(COLUMN_DATE / 1000,'unixepoch') BETWEEN date(1578530800000 / 1000,'unixepoch') AND  date(1578697200000 / 1000,'unixepoch');

SO

String selection = "date(" +Wdatabase.COLUMN_DATE + "/ 1000,'unixepoch') BETWEEN date(" + startDate + "/1000,'unixepoch') AND "date(" + endDate + "/1000,'unixepoch')";

ИЛИ (как было бы рекомендовано)

String selection = "date(" +Wdatabase.COLUMN_DATE + "/ 1000,'unixepoch') BETWEEN date(?/1000,'unixepoch') AND date(?/1000,'unixepoch')";
Cursor r = Objects.requireNonNull(getActivity()).getContentResolver().query(DbProvider.CONTENT_URI, projection, selection, new String[]{String.valueOf(startDate),String.valueOf(endDate)}, null, null);
  • Таким образом, параметры связаны (т. е. каждое? в предложении WHERE безопасно заменяется значениями по принципу 1 на 1)
  • ВНИМАНИЕ! Использование BEWTEEN это немного упрощает запрос, поскольку ему нужен только столбец указывается один раз.
  • , если вы хотите, чтобы вместо минуты использовалась дата, а не дата (3 события). В основном / 1000 отбрасывает миллисекунды.
  • Обратите внимание, что вышеприведенный код является принципиальным и не был запущен или протестирован и поэтому может содержать некоторые ошибки. Сказать, что оригинал SQL был протестирован с использованием

: -

DROP TABLE IF EXISTS thetable;
create table thetable (COLUMN_ID integer primary key autoincrement, COLUMN_DATE integer not null, COLUMN_STATUS text not null, COLUMN_TOTAL text not null);
INSERT INTO thetable (COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL) VALUES
    (1578524400000,'enter',0),
    (1578530800000,'exit',1),
    (1578611801022,'enter',2),
    (1578697200000,'enter',3),
    (1578698202000,'exit',1),
    (1578783710000,'enter',2);

SELECT COLUMN_ID,COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL, datetime(COLUMN_DATE / 1000,'unixepoch') FROM thetable WHERE date(COLUMN_DATE / 1000,'unixepoch') BETWEEN date(1578530800000 / 1000,'unixepoch') AND  date(1578697200000 / 1000,'unixepoch');
DROP TABLE IF EXISTS thetable;

Что приводит к: -

COLUMN_ID   COLUMN_DATE COLUMN_STATUS   COLUMN_TOTAL    datetime(COLUMN_DATE / 1000,'unixepoch')
2   1578530800000   exit    1   2020-01-09 00:46:40
3   1578611801022   enter   2   2020-01-09 23:16:41
4   1578697200000   enter   3   2020-01-10 23:00:00
5   1578698202000   exit    1   2020-01-10 23:16:42
0 голосов
/ 12 января 2020

Ваш запрос неверный. Вы должны поместить переменные в метод query () вместо первого нуля, а не в аргументе выбора.

проверьте это

...