NSDate представление в сгенерированной базе данных SQLite?
Я использую NSDate для представления даты / времени в рамках DBAccess. Тем не менее, когда я запускаю SQL-запросы, такие как
select date(start) from actions
У меня странное свидание вместо моего свидания. Даже запросы DBAccess не работают, например:
DBResultSet *today = [[[Actions query] where:@"date(end) = date('now')"] fetch];
В SQLite тип столбца правильный - отметка времени. Так что есть ли способ, как правильно работать с датами / временем?
Спасибо,
Jindrich
2 ответа
Я наконец-то закончил с использованием функций sqlite вместо преобразования NSDate, как предполагает @Adrian_H. Мой код для сегодняшних предметов выглядит так:
DBResultSet *today = [[[[Actions query] where:@"date(datetime(end, 'unixepoch', 'localtime')) = date('now')"] orderByDescending:@"id"] fetch];
Это приводит элементы, где конечное значение сегодня.
NSDate хранятся как EPOCH, и любой объект NSDate преобразуется, когда используется как параметр.
Таким образом, ваш запрос станет:
DBResultSet *today = [[[Actions query] whereWithFormat:@"end = %@", [NSDate date]] fetch];
Очевидно, что это не сработает, если вы не сохраните и не урежете секунды до даты сохранения или получения.
Это должно было бы стать:
DBResultSet *today = [[[Actions query] whereWithFormat:@"end >= %@ AND end <= %@", beginingOfDay, endOfDay] fetch];
Мы могли бы добавить внутреннюю функцию в SQLite, чтобы помочь поддерживать их лучше, любые предложения будут приветствоваться. Лучше всего просто перегрузить существующие функции.
Если вы хотите всегда хранить NSDate без точности секунд, вы всегда можете добавить что-то в метод entityWillInsert и создать расширение для NSDate, чтобы дать вам начало дня,
- (BOOL)entityWillInsert {
self.end = [self.end dateTrimmedToStartOfDay];
return YES;
}
Это может быть более простым способом сохранить весь код простым.
Спасибо Адриан