2016-08-21 2 views
0

Моей таблицы выглядит следующим образом:SQLite удалить строку с помощью временной метки <х дней

tx.executeSql(
    "CREATE TABLE IF NOT EXISTS mytable (
     msg_id UNSIGNED INT PRIMARY KEY ASC, 
     msg_when DATETIME, 
     msg_read INTEGER, 
     title TEXT, msg_text TEXT 
    )", 

добавить записи, используя этот запрос:

tx.executeSql(
    "INSERT OR REPLACE INTO mytable 
    (msg_id, msg_when, msg_read, title, msg_text) 
    VALUES 
    (?,?,?,?,?)", 

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

tx.executeSql(
    "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-? days')", [days], 

Я также попытался:

var strQuery = "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-" +days +" days')"; 
tx.executeSql(strQuery, 

и:

var strQuery = "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-4 days')"; 
tx.executeSql(strQuery, 

Данные выглядит следующим образом:

json: {"status":"OK" 
,"count":1 
,"msg_id":"94" 
,"when":"2016-08-23 11:21:01" 
,"alerts":[ 
    {"msg_id":"44" 
    ,"title":"Medical Emergency" 
    ,"text":"Heart Attack" 
    ,"msg_when":"2016-08-05 14:52:03" 
    } 
    ] 
} 

Кроме удаления строк по дате, все отлично работает. Любые предложения о том, что я могу сделать, чтобы исправить удаление?

ответ

0

Хорошо, что есть на самом деле две уловки, чтобы решить это.

Во-первых, если вы объявляете свое поле как datetime (это не более чем целое число), вы НИКОГДА не получите это для работы. Не под iOS 9.x, а не под Android, а не на Chrome 52.0.2743.116 м (64-разрядная версия) в Windows 10.

Что вам нужно сделать, это сохранить свою дату как поле ТЕКСТ и сохранить ваше время-дату как строка, как это:

tx.executeSql("CREATE TABLE IF NOT EXISTS mytable (msg_id UNSIGNED INT PRIMARY KEY ASC, msg_when TEXT, msg_read INTEGER, title TEXT, msg_text TEXT)", 

Далее, вы должны обернуть сравнение в (скобках), так что SQLite рассматривает его как формулы и делает математические преобразования для вас ... как это:

tx.executeSql(DELETE FROM mytable WHERE (msg_when <= datetime('now', '-4 days'))", 

Обратите внимание на скобки перед столбцом (msg_when и после закрывающей скобки в datetime)) func Тион.

2

Проблема с оператором DELETE заключается в том, что шаблон параметра (?) находится внутри строкового литерала и поэтому игнорируется. Вы должны использовать оператор конкатенации (||):

DELETE FROM mytable WHERE msg_when <= datetime('now', '-' || ? || ' days') 
+0

Это не решит проблему. Как FYI, я также попытался: УДАЛИТЬ ОТ mytable WHERE msg_when <= datetime ('now', '- "+ days +" days') и строит правильную строку (в моем случае «-4 дня», но я у вас есть сообщения, которые старше 3 недель – ppetree

+0

Если он не работает, вам нужно будет добавить некоторые примеры данных в свой вопрос. Имейте в виду, что дата/время хранятся в SQLite как строки ISO 8601, и это то, что возвращает функция 'date' Если ваши данные не в этом формате, это не сработает. Обратите внимание, что SQLite не будет ** применять формат - так же, как он не будет применять типы столбцов и т. Д. – cartant

+0

Спасибо за информацию. как передано из mysql как json-строка «YYYY-MM-DD hh: mm: ss» классно называется msg_when. ;-) Они запрашивают и отображают как таковые. – ppetree