我在DBAccess框架中使用NSDate表示日期/时间。但是,当我运行像
这样的SQL查询时select date(start) from actions
我得到了奇怪的约会,而不是约会。即使是DBAccess查询也不起作用,例如:
DBResultSet *today = [[[Actions query] where:@"date(end) = date('now')"] fetch];
在SQLite中,列类型是正确的 - 时间戳。那么有没有办法如何正确使用日期/时间?
谢谢,
英德日赫
答案 0 :(得分:0)
NSDate存储为EPOCH,任何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;
}
这可能是让所有代码保持简单的更简单方法。
由于 阿德里安
答案 1 :(得分:0)
我最终使用sqlite函数结束,而不是像@Adrian_H建议的那样转换NSDate。我今天的项目代码如下:
DBResultSet *today = [[[[Actions query] where:@"date(datetime(end, 'unixepoch', 'localtime')) = date('now')"] orderByDescending:@"id"] fetch];
此结果项目,其中结束值为今天。