проблема даты SQLite iPhone - PullRequest
       8

проблема даты SQLite iPhone

3 голосов
/ 24 августа 2009

База данных создается просто отлично, а вставка работает просто отлично. У меня проблема с утверждением select ниже. Он не возвращает никаких записей и ошибок. Выбор на любом другом поле работает просто отлично. Кто-нибудь может заметить, что я делаю не так?

"create table if not exists data (pkey integer primary key, doc date)"

[db executeUpdate:@"insert into data ( doc) values (?)" , [NSDate date]];

"select * FROM data WHERE doc between '2009-08-23' and '2009-08-23' "

Ответы [ 3 ]

10 голосов
/ 24 августа 2009

Часть between '2009-08-23' and '2009-08-23' всегда ложна, потому что это диапазон нулевого времени, из-за отсутствия лучшего описания.

Если вы хотите, чтобы элементы встречались ровно 2009-08-23, выберите between '2009-08-23' and '2009-08-24', который будет варьироваться от полуночи 23-го до полуночи 24-го.

Вот пример этого в действии:

sqlite> CREATE TABLE t (d DATETIME);
sqlite> SELECT DATETIME('now');
2009-08-24 02:32:20
sqlite> INSERT INTO t VALUES (datetime('now'));
sqlite> SELECT * FROM t;
2009-08-24 02:33:42
sqlite> SELECT * FROM t where d BETWEEN '2009-08-24' and '2009-08-24';
sqlite> SELECT * FROM t where d BETWEEN '2009-08-24' and '2009-08-25';
2009-08-24 02:33:42
2 голосов
/ 24 августа 2009

Мне нужно было выполнить этот точный тип поиска в sqlite, и вот простой пример форматирования даты, чтобы получить метки времени начала и конца дня для вашей даты.

В моем случае я храню метки времени с этим форматом меток времени в sqlite: "гггг-мм-дд чч: мм: сс.сссс". В этом примере используется текущая дата ([NSDate date]).

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
NSDate *startOfDay = [dateFormatter dateFromString:dateString];  
// add a full day and subtract 1 second to get the end of day timestamp
NSDate *endOfDay = [startOfDay addTimeInterval:(60*60*24)-1];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSS"];

Затем вы можете использовать startOfDay и endOfDay для значений вашего запроса.

1 голос
/ 26 августа 2009

SQLite выполняет сравнение строк, а не сравнение дат.

Итак, один из способов решения вашей проблемы:

"выбрать * ИЗ данных, ГДЕ документация между '2009-08-23" и "2009-08-23 99"

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