在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“日志成功)。我很困惑......
答案 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并获得一致的结果......