sqlite 按时间戳 < x 天删除行

sqlite delete row by timestamp < x days

我的 table 看起来像这样:

 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 
    (?,?,?,?,?)",

我想删除超过 'x' 天的行,我正在使用此查询但没有删除任何内容,正在调用成功回调,没有影响任何行。

 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"
   }
  ]
 }

除了按日期删除行外,一切正常。关于我可以做些什么来修复删除有什么建议吗?

DELETE 语句的问题是参数模板 (?) 在字符串文字中,因此被忽略。您需要使用连接运算符 (||):

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

好的,实际上有两个技巧可以解决这个问题。

首先,如果您将字段声明为日期时间(只不过是一个整数),您将永远无法使用它。不在 iOS 9.x 之下,不在 Android 之下,也不在 Chrome 52.0.2743.116 m(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 列之前和日期时间的右括号之后)) 函数的括号。

从 AIS 中删除 timpstamp < datetime('now', '-1 分钟')

这应该可以,如果不行,请检查保存时间戳的 table, 检查时间字符串的格式,应该是 YYYY-MM-DD HH:MM:SS ,如果你的 forfamt 不匹配,命令将不起作用。

使用 SQLite 保存时间戳,而不是使用系统命令。