запрос базы данных SQLite для дат - PullRequest
0 голосов
/ 03 ноября 2018

Я новичок в базах данных и экспериментирую с 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 голосов
/ 03 ноября 2018

Использование: -

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

Однако, вероятно, было бы лучше не заключать значение в одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...