我是数据库新手,正在尝试使用SQLite最新版本3.25.2
我用文件信息建立了一个简单的数据库,将日期存储为ISO STRING(文本)。所有项目的查询显示:
sqlite3_exec(db, "SELECT * FROM dir", callback, 0, 0);
导致(通过回调输出)
system.NAME = New File.txt
modified = '2018-11-03 11:35:42'
system.NAME = ReadMe.txt
modified = '2018-11-01 10:43:21'
...
但是当我尝试查询一个特定的日期(比所述日期更新的文件)时,查询结果为空!?
sqlite3_exec(db, "SELECT * FROM dir WHERE modified > '2018-11-02 00:00:00'", callback, 0, 0);
从上面的数据库文件中可以看到,至少一个(New file.txt)应该与查询匹配。我还尝试过将日期存储为整数和实数,没有任何运气
这一定是愚蠢的,但我看不到它:(
答案 0 :(得分:0)
使用:-
rc = sqlite3_exec(db,"CREATE TABLE IF NOT EXISTS dir (system_name TEXT, modified TEXT);",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"INSERT INTO dir VALUES('New File.txt','2018-11-03 11:35:42'),('Readme.txt','2018-11-01 10:43:21');",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"SELECT * FROM dir;",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"SELECT * FROM dir WHERE modified > '2018-11-02 00:00:00';",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
结果:-
system_name = New File.txt
modified = 2018-11-03 11:35:42
system_name = Readme.txt
modified = 2018-11-01 10:43:21
system_name = New File.txt
modified = 2018-11-03 11:35:42
但是考虑到您的输出在输出中的日期周围有单引号,则:-
rc = sqlite3_exec(db,"CREATE TABLE IF NOT EXISTS dir (system_name TEXT, modified TEXT);",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"DELETE FROM dir;",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"INSERT INTO dir VALUES('New File.txt','''2018-11-03 11:35:42'''),('Readme.txt','''2018-11-01 10:43:21''');",callback,0,&zErrMsg);
sqlite3_free(zErrMsg); //<<<<<<<<<< ADDED single quotes
rc = sqlite3_exec(db,"SELECT * FROM dir;",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
rc = sqlite3_exec(db,"SELECT * FROM dir WHERE modified > '2018-11-02 00:00:00';",callback,0,&zErrMsg);
sqlite3_free(zErrMsg);
产生您的结果。基本上是因为将单引号作为值的一部分存储(至少在显示的uotput中如此显示)被考虑在内。
因此,解决该查询的方法是使用:-
sqlite3_exec(db,"SELECT * FROM dir WHERE modified > '''2018-11-02 00:00:00''';",callback,0,0);
但是,最好不要将值用单引号引起来。