2012年7月26日 星期四

查詢計算未來幾天後的日期

有時候需要去計算未來幾天後的日期,
不過 Objective-C 有計算未來幾秒後的功能,用的是
[NSDate dateWithTimeIntervalSinceNow:second];
這是可以計算未來幾天後的日期,
不過如果要算一個月後了?
因為一個月有分大月與小月,另外還有潤年的問題,
用這個算法就不實用,所以我找到了另一個方法,
還記得我之前說的 FMDB 嗎?
在 SQL 語法中剛好有這項功能,
所以可以直接使用,這樣子可以省下判斷大月與小月的時間,
只不過使用 SQL 時會增加記憶體的使用,
這是犧牲記憶體容量來縮減判斷時間的作法,
那麼要如何做了?

在 SQL 語法中查詢未來天數的寫法是,
SELECT DATE('2012-07-26', '+ X day');
其中 "+ X day" 的 X 就是要增加的天數,
如果要增加的月份的時候就改成 "+ X month" 就好了,
同理,要增加年份也是一樣的,
還有如果改成 "- X day" 的時候是計算過去的日期,
另外日期的格式必須要是 "YYYY-MM-DD" 的格式才行,

還有另一個是格式化輸出的日期,語法如下
SELECT STRFTIME('%Y-%m-%d','2012-07-26');
因為上面的輸出格式是固定的,不過有時候會想要改變輸出的格式,
所以就需要這個語法了,
其中 %Y 指的是年,%m 指的是月份,%d 指的是日期,
只要在這三個之間插入不同的東西就會輸出不同的格式,
像是 "%Y年%m月%d日" 就會輸出 "2012年07月26日"。

所以就結合 FMDB 的方式來計算未來幾天後的日期做成了一個 Method,
- (NSString *)seachFutureDate:(NSString *)date withDay:(int)day andFormate:(NSString *)formate{
FMDatabase *db = [FMDatabase databaseWithPath:nil];

if (![db open]) {
NSLog(@"DB Can't Open");
}

NSString *dayStr = [NSString stringWithFormat:@"+%d day", day];

FMResultSet *rs = [db executeQuery:@"SELECT STRFTIME(?,DATE(?, ?));", formate, date, dayStr];

NSString *dateStr = [[NSString new] autorelease];

while ([rs next]) {
dateStr = [rs stringForColumnIndex:0];
}

[db close];

return dateStr;
}

因為這個查詢的動作不需要真的有資料庫的檔案才能做,
所以不會佔用任何資料空間,
而且只要小小的修改就能變成查詢幾月後的日期與幾年後的日期了,
這樣子計算天數會更加方便。

沒有留言: