Функция даты в SQLite не выбирает строки в базе данных - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть столбец c в таблице tbl, который содержит следующие значения.

Tue, 15 Nov 2011 14:21:32 GMT
Tue, 15 Nov 2011 12:59:21 GMT
Tue, 15 Nov 2011 12:15:48 GMT
Tue, 15 Nov 2011 12:10:33 GMT
Tue, 15 Nov 2011 11:12:09 GMT
Tue, 15 Nov 2011 11:09:14 GMT
Tue, 15 Nov 2011 10:38:01 GMT
Tue, 15 Nov 2011 10:36:33 GMT
Tue, 15 Nov 2011 10:09:21 GMT
Tue, 15 Nov 2011 09:23:01 GMT
Tue, 15 Nov 2011 08:24:39 GMT
Mon, 14 Nov 2011 22:44:53 GMT
Mon, 14 Nov 2011 21:03:28 GMT
Mon, 14 Nov 2011 20:12:11 GMT
Mon, 14 Nov 2011 19:08:34 GMT
Mon, 14 Nov 2011 18:40:05 GMT
Mon, 14 Nov 2011 18:07:00 GMT
Mon, 14 Nov 2011 18:04:00 GMT
Mon, 14 Nov 2011 17:37:45 GMT

Эти значения были взяты из команды:

select c from tbl;

Когда я запускаю:

select count(*) from tbl where c < date('2011-11-18');

результат равен 0

Что здесь не так?

спасибо

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

В вашей базе данных хранятся обычные строки, а не строки даты и времени SQLite.

Чтобы содержимое столбца TEXT было распознано как дата и время, оно должно храниться в формате YYYY-MM-DD HH:MM:SS.SSS. * 1004.*

Чтобы получить требуемые результаты из имеющихся у вас данных, вам придется использовать сравнение строк, и выполнение требуемого < сравнения будет непростым делом (вам нужно изучить подстроки и найти year < 2011 OR month IN (JAN,FEB,MAR. . .) OR (month = 'NOV' AND day < 18).

Лучше:

  1. Найдите, куда вставляются данные, и измените их, чтобы вставить «правильную» дату SQLite и

  2. Выполните одноразовую процедуру над существующими данными, чтобы переформатировать ее.

2 голосов
/ 18 ноября 2011

Прежде всего, вы должны сделать некоторые манипуляции со строкой даты, прежде чем добавить ее в базу данных.В основном он должен содержать только: год, месяц, день, час, минуты, секунды, миллисекунды (необязательно).Все данные представлены в виде чисел, внутри не должно быть никаких строк.

Я создал небольшую таблицу:

> sqlite3 ':memory:'
sqlite> CREATE TABLE tbl (c text);
sqlite> INSERT INTO tbl (c) VALUES ('2011-11-15 14:21:32');
sqlite> INSERT INTO tbl (c) VALUES ('2011-11-15 12:59:21');
sqlite> INSERT INTO tbl (c) VALUES ('2011-11-15 12:15:48');
sqlite> INSERT INTO tbl (c) VALUES ('2011-11-15 12:10:33');
sqlite> INSERT INTO tbl (c) VALUES ('2011-11-15 11:12:09');
sqlite> INSERT INTO tbl (c) VALUES ('2011-12-15 11:12:09');

sqlite> SELECT strftime('%Y-%m-%d %H:%M:%S', c) FROM tbl WHERE strftime('%Y-%m-%d %H:%M:%S', c) < strftime('%Y-%m-%d', '2011-12-15');

Дает мне хороший результат:

2011-11-15 14:21:32
2011-11-15 12:59:21
2011-11-15 12:15:48
2011-11-15 12:10:33
2011-11-15 11:12:09
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...