SQLite3 - 选择日期范围不起作用

时间:2010-04-22 14:54:47

标签: iphone objective-c sqlite

另一个让我悲伤的人。

在SQLite3数据库中选择I查询(NSDate *)fromDate to(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 x“日志成功)。我很困惑......

2 个答案:

答案 0 :(得分:1)

SQLite没有日期类型(尽管它具有良好的日期功能)。您的比较是在字符串上完成的,为了使它们正常工作,您应该将格式更改为yyyyMMdd或yyyy-MM-dd,以便按日期顺序排序。

答案 1 :(得分:1)

你也可以尝试一种不同的更自然的方式(自然的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似乎是任何包含日期数据的字段,无论是字符串,utf,整数,还是实现可能有所不同。

我使用sqlite3和python 2.6并获得一致的结果......