我已经浏览了无数的帖子,但似乎仍然无法达到预期的结果。
我的日期/时间戳作为字符串存储在 SQLite 数据库中,如下所示:Sun Apr 16 00:26:33 GMT+01:00 2017
我想要实现的是仅检索过去 48 小时(现在到 2 天前)存储在数据库中的项目。我整理的以下代码继续返回超过 48 小时/2 天的结果。
public Cursor searchInboxEmails(String search, String twoDaysAgo, String today) throws SQLException {
Cursor cursor = null;
try {
if (search != null && !search.trim().isEmpty()) {
String received = "Received";
search = "%" + search + "%";
String query = "SELECT * FROM " + TABLE_NAME_1
+ " WHERE " + MESSAGE_TYPE + " IN (?)"
+ " AND " + FROM_EMAIL + " LIKE (?) OR " + CC_EMAIL + " LIKE (?) OR "
+ SUBJECT + " LIKE (?) OR " + MESSAGE + " LIKE (?)"
+ " AND " + "DATETIME(" + DATE_RECEIVED + ") BETWEEN DATETIME(?) AND DATETIME(?)"
+ " ORDER BY " + _ID + " DESC";
String[] params = {received, search, search, search, search, twoDaysAgo, today};
cursor = database.rawQuery(query, params);
if (cursor != null) {
cursor.moveToFirst();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return cursor;
}
值“twoDaysAgo”和“today”也是格式化字符串,看起来与存储的字符串(“DATE_RECEIVED”)相同。任何有关获得所需功能的帮助都会有很大帮助。
<小时/>编辑: 我添加了一个附加列“TIMESTAMP”,它保存 Epoch 值(例如 1492337028),并且以下函数效果很好(仅显示时间戳之后的项目):
String received = "Received";
String query = "SELECT * FROM " + TABLE_NAME_1
+ " WHERE " + MESSAGE_TYPE + " IN (?)"
+ " AND DATETIME(" + TIMESTAMP + ") >= DATETIME(?)"
+ " ORDER BY " + TIMESTAMP + " DESC";
String[] params = {received, twoDaysAgo};
cursor = database.rawQuery(query, params);
但是,当尝试搜索时间戳之后的项目时,它也会返回时间戳之前的项目,那么如何修改以下函数以仅搜索时间戳之后的项目?
String received = "Received";
search = "%" + search + "%";
String query = "SELECT * FROM " + TABLE_NAME_1
+ " WHERE " + MESSAGE_TYPE + " IN (?)"
+ " AND " + FROM_EMAIL + " LIKE (?) OR " + CC_EMAIL + " LIKE (?) OR "
+ SUBJECT + " LIKE (?) OR " + MESSAGE + " LIKE (?)"
+ " AND DATETIME(" + TIMESTAMP + ") >= DATETIME(?)"
+ " ORDER BY " + TIMESTAMP + " DESC";
String[] params = {received, search, search, search, search, twoDaysAgo};
cursor = database.rawQuery(query, params);
最佳答案
您有两种选择来执行您所要求的操作。
第一个选项:将 DATE_RECEIVED 的数据类型更改为 INTEGER,然后使用以毫秒为单位的时间对其进行初始化。在 params 中对两天前和今天做同样的事情;将它们转换为以毫秒为单位的时间。现在您的查询应该可以工作了。
第二个选项:检查 this问题。您可能需要为此更改时间戳格式,但我不确定。
关于java - Android SQLite 日期查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43484328/