生成的SQLite数据库中的NSDate表示?

时间:2015-06-02 08:43:33

标签: dbaccess

我在DBAccess框架中使用NSDate表示日期/时间。但是,当我运行像

这样的SQL查询时
select date(start) from actions

我得到了奇怪的约会,而不是约会。即使是DBAccess查询也不起作用,例如:

DBResultSet *today = [[[Actions query] where:@"date(end) = date('now')"] fetch];

在SQLite中,列类型是正确的 - 时间戳。那么有没有办法如何正确使用日期/时间?

谢谢,

英德日赫

2 个答案:

答案 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];

此结果项目,其中结束值为今天。