2015-06-02 2 views
1

Я использую NSDate для представления даты/времени в структуре DBAccess. Однако, когда я запускаю SQL-запросы, напримерNSDate-представление в базе данных SQLite?

select date(start) from actions 

У меня есть странная дата вместо моей даты. Даже DBAccess запросов не работает, как:

DBResultSet *today = [[[Actions query] where:@"date(end) = date('now')"] fetch];

В SQLite тип столбца правильно - метка времени. Итак, есть ли способ правильно работать с датами/временем?

Благодаря,

Йиндржих

+0

Показать фактические и ожидаемые значения даты и, пожалуйста, правильно пометить ваш вопрос. – Droppy

+0

@sarsonj, ответил ли ответ ниже? Вы все еще испытываете проблемы? –

+0

@Adrian_H Я использовал другой подход, см. Ниже. Но все равно спасибо! – sarsonj

ответ

0

я, наконец, закончилась с использованием SQLite функций, вместо преобразования NSDate, как предполагает @Adrian_H. Мой код на сегодня выглядит так:

DBResultSet *today = [[[[Actions query] where:@"date(datetime(end, 'unixepoch', 'localtime')) = date('now')"] orderByDescending:@"id"] fetch]; 

Это результаты, на которых конечная ценность сегодня.

0

NSDate хранятся в ЭПОХИ, и любой объект 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; 
} 

Это может быть более простым способом сохранить весь код простым.

Благодаря Адриан

Смежные вопросы