SQLite3 - выбор диапазона дат не работает - PullRequest
1 голос
/ 22 апреля 2010

еще один, который дает мне горе.

В базе данных SQLite3 выберите запрос I для диапазона дат, указанного в (NSDate *) отDate до (NSDate *) toDate

const char *sql = "SELECT * FROM A, B WHERE A.key = B.key AND A.date between ? and ?";

После открытия БД я запускаю запрос в Objective-C следующим образом:

NSDateFormatter *tmpDatFmt = [[[NSDateFormatter alloc] init] autorelease];
[tmpDatFmt setDateFormat:@"dd-MM-yyyy"];

sqlite3_stmt *stmt;

if(sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
    NSLog(@"From %s to %s;", [[tmpDatFmt stringFromDate:fromDate] UTF8String], [[tmpDatFmt stringFromDate:toDate] UTF8String]);

    sqlite3_bind_text(stmt, 1, [[tmpDatFmt stringFromDate:fromDate] UTF8String], -1, SQLITE_STATIC);  // first '?'
    sqlite3_bind_text(stmt, 2, [[tmpDatFmt stringFromDate:toDate]   UTF8String], -1, SQLITE_STATIC);  // second '?'

    while(sqlite3_step(stmt) == SQLITE_ROW) {
        NSLog(@"Success");}

В базе данных у меня есть несколько записей, которые соответствуют диапазону дат:

12-04-2010 = in seconds 1271059200
13-04-2010 = in seconds 1271145600
13-04-2010 = in seconds 1271152800
14-04-2010 = in seconds 1271267100

Когда я запускаю его, первый NSLog показывает

From 2010-04-01 to 2010-04-30

Моя проблема в том, что записи не выбраны (в журнале не отображается "Успех"), и я не понимаю, почему.

ранее я просчитал даты через 2 дня как

14-04-2010 = in seconds 1271232000
15-04-2010 = in seconds 1271318400
15-04-2010 = in seconds 1271325600
16-04-2010 = in seconds 1271439936

Эти даты работали нормально (4 х "Успех в журнале". Я озадачен ...

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Вы также можете попробовать другой более естественный способ (естественный для sqlite):

select date(..date.fld...,'start of year') = '2011-01-01' ; 
  //any 2011 date will get selected
select date(..date.fld...,'start of year') >= '2011-01-01'; 
  // 2011, 2012 etc

, чтобы увидеть другие функции даты, проверьте эту ссылку: www.sqlite.org / lang_datefunc.htm

На самом деле date.fld представляется любым полем, в котором есть данные даты, независимо от того, могут ли отличаться реализации, кроме строк, реализаций.

Я использую sqlite3 с python 2.6 и получаю согласованные результаты ...

1 голос
/ 22 апреля 2010

SQLite не имеет типа даты (хотя он имеет хорошие функции даты). Ваши сравнения сделаны на строках. Чтобы они работали правильно, вы должны изменить формат на yyyyMMdd или yyyy-MM-dd, чтобы они сортировались в порядке даты.

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