如何解决如何使用 datetime('now', '-1 day') 使用准备好的语句检索 sqlite3 数据库中的行?
给定一个这样设计的表格:
CREATE TABLE calls(timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,callerid TEXT,contactid INTEGER)
如果我想提取时间戳在 1 天内的所有行,我可以使用这个 sql:
SELECT * FROM calls WHERE timestamp >= datetime('Now','-1 day');
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("mydb.db",&db);
const char* sql = "SELECT * FROM calls WHERE timestamp >= datetime('Now','-1 day');";
rc = sqlite3_exec(db,sql,callback,&err_msg);
当然,我必须设置回调函数来处理检索记录。
但是如果我想使用准备好的语句执行相同的 SELECT 语句,我该怎么做?
我是这样试的:
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("mydb.db",&db);
sqlite3_stmt *stmt = NULL;
const char* sql = "SELECT rowid,* FROM calls WHERE timestamp >= :timestamp;";
rc = sqlite3_prepare_v2(db,-1,&stmt,NULL);
int idx = sqlite3_bind_parameter_index(stmt,":timestamp");
rc = sqlite3_bind_text(stmt,idx,"datetime('Now','-1 day')",sqlITE_STATIC); break;
// but this while loop exits immediately - ie no data returned
while ((rc = sqlite3_step(stmt)) != sqlITE_DONE) {
// code here to extract field data
}
rc = sqlite3_finalize(stmt);
但是 sqlite3_step 立即返回 sqlITE_DONE,即它不返回任何数据。
解决方法
使用 SQLite 的连接运算符 ||
连接命名参数 :days
,它将是 sql 语句中类似 "-1"
的字符串:
const char* sql = "SELECT rowid,* FROM calls WHERE timestamp >= datetime('now',:days || ' day');";
rc = sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
int idx = sqlite3_bind_parameter_index(stmt,":days");
rc = sqlite3_bind_text(stmt,idx,"-1",SQLITE_STATIC);
或者如果你想传递一个像 "-1 day"
这样的字符串和一个命名参数 :period
:
const char* sql = "SELECT rowid,:period);";
rc = sqlite3_prepare_v2(db,":period");
rc = sqlite3_bind_text(stmt,"-1 day",SQLITE_STATIC);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。