1

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

select date(start) from actions

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

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

在 SQLite 中,列类型是正确的 - 时间戳。那么有什么方法可以正确处理日期/时间吗?

谢谢,

金德里奇

4

2 回答 2

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;
}

这可能是保持所有代码简单的更简单方法。

谢谢阿德里安

于 2015-06-02T08:54:59.610 回答
0

我最终以使用 sqlite 函数结束,而不是像 @Adrian_H 建议的那样转换 NSDate。我今天项目的代码如下所示:

DBResultSet *today = [[[[Actions query] where:@"date(datetime(end, 'unixepoch', 'localtime')) = date('now')"] orderByDescending:@"id"] fetch];

这会产生最终价值为今天的项目。

于 2015-06-18T12:40:49.887 回答