查询SQLite数据库的日期

时间:2018-11-03 13:51:29

标签: c++ winapi sqlite

我是数据库新手,正在尝试使用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)应该与查询匹配。我还尝试过将日期存储为整数和实数,没有任何运气

这一定是愚蠢的,但我看不到它:(

1 个答案:

答案 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);

但是,最好不要将值用单引号引起来。