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 保存时间戳,而不是使用系统命令。
我的 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 保存时间戳,而不是使用系统命令。