проблема при использовании значения столбца базы данных в Date () SQLite Android - PullRequest
0 голосов
/ 28 октября 2018


У меня небольшая проблема, я много раз гуглял, но не смог получить ...
Я использую запрос (sqlite) для получения некоторых данных ..
в этом запросеих значение Date () используется для увеличения определенного числа динамического числа дней (исходя из столбца в той же таблице) ..
если я поставлю эти дни статическими (1,2,3, .....), то все будет работать нормальноно если я добавлю имя столбца, это не так.
этот запрос не выполняется, и я хочу, чтобы он работал:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "',' " + REPETITIONS + " day') ";

это работает нормально:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "','2 day') ";

где

targetDate: дата, введенная пользователем для получения событий с этой датой

DATE: дата каждого события в таблице

REPETETIONS: динамическое число (столбец в той же таблице)

проблема заключается в использовании REPETITIONS в функции даты ...

создать оператор

String SQL_CREATE_EVENT_TABLE = "CREATE TABLE " + TABLE_NAME + " ( " +
            ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TITLE + " TEXT ," +
            DATE + " TEXT , " +
            IS_NOTIFY + " INTEGER , " +
            NOTIFICATION_TIME + " TEXT ," +
            REPEAT + " INTEGER ," +
            REPEAT_DURATION + " INTEGER ," +
            REPETITIONS + " INTEGER ," +
            CERTAIN_DATE + " TEXT ," +
            NOTE + " TEXT ," +
            IS_SPOKEN + " INTEGER " +
            " );";

, и этоВыбор оператора

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE " + DATE + " = '" + targetDate
            + "' OR (( " + REPEAT + " = '1' AND " + REPEAT_DURATION + " = '0' ) AND " + DATE + " <= '" + targetDate + "')"
            + " OR( " + REPEAT + " = '1' AND " + REPEAT_DURATION + " = '3' ) AND " + DATE + " <= '" + targetDate + "' AND " + CERTAIN_DATE + " >= '" + targetDate + "'"
            + " OR (" + REPEAT + " = '1' AND " + REPEAT_DURATION + "= '2' ) AND " + targetDate + " >= '" + DATE + "' AND "+ targetDate+ " <= date('" + DATE + "','" + REPETITIONS + " days')";

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

В sqlite date() function , NNN days является модификатором строки, а не выражением.Поэтому вы не можете использовать имена столбцов или даже || конкатенацию строк там.

Вы можете отформатировать строку модификатора в своем коде и поместить ее в SQL.Это требует дополнительного запроса к базе данных, что, вероятно, не то, что вам нужно.

Если вы можете считать, что каждый день длится 24 часа (что не всегда верно, например, рассмотрите события DST), вы можете попробовать что-то вроде

... date(strftime('%s', '" + targetDate + "', " + REPETITIONS + "*24*60*60, 'unixepoch') ...

, где strftime('%s', ...) преобразуется в секунды, а date(..., 'unixepoch') преобразуется обратно в метку даты.

Но если серьезно, я бы хотел перестроить схему, чтобы лучше соответствовать вашим функциональным требованиям.

0 голосов
/ 28 октября 2018

Переменная REPETITIONS в этом выражении:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "',' " + REPETITIONS + " day') ";

должна быть числом, а не именем столбца.Функция date в SQLite имеет различные синтаксисы, но вы используете этот:

SELECT date('2014-10-23','+7 day');

Вы должны указать число до day.

Редактировать Попробуйте это:

String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME + " WHERE "
            + DATE + " = date('" + targetDate + "', " + REPETITIONS + " || ' day') ";
...