java - Android SQLite 日期查询

标签 java android mysql sqlite date

我已经浏览了无数的帖子,但似乎仍然无法达到预期的结果。

我的日期/时间戳作为字符串存储在 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/

相关文章:

java - 如何在android studio中的QR码中使用希腊字母对文本进行编码

php - 如何在mysql中得到不重复的结果

java - 如何在 List 的每个元素上调用方法?

java - 如何布局组件,使中间组件获得所有空间,但最右边的组件左对齐?

android - 从加速度计android获取移动速度

android - 在 Android 中从 Parse.com 检索对象

mysql - 在许多具有相同结构的mySql表中搜索数据

sql - mysql左连接问题

java - 如何从 DatePickerDialog 获取月份和年份?

java - 如何使 Java 和 Postgres 枚举协同工作以进行更新?