查询SQLite数据库中的日期

querying SQLite database for dates

本文关键字:日期 数据库 SQLite 查询      更新时间:2023-10-16

我是数据库新手,正在试用SQLite最新版本3.25.2

我用文件信息建立了一个简单的数据库,将日期存储为ISO字符串(文本(。所有项目的查询显示:

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

而从上面数据库中的文件中可以看到,至少有一个(Newfile.txt(应该与查询匹配。我还尝试将日期存储为整数和实数,但没有任何运气

这一定是什么愚蠢的东西,但我看不出来:(

使用:-

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

确实产生了你的结果。基本上是因为单个报价在作为价值的一部分存储时会被考虑在内(至少从您显示的报价中可以看出(。

因此,该查询的修复方法是使用:-

sqlite3_exec(db,"SELECT * FROM dir WHERE modified > '''2018-11-02 00:00:00''';",callback,0,0);

但是,最好不要将值括在单引号中。