2017-04-19 78 views
0

我已经经历了无数次的帖子,但仍然无法达到预期的效果。Android SQLite日期查询

我的日期/时间戳作为字符串存储在SQLite数据库,其中一个看起来像:太阳4月16日零时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”和“今天”也格式的字符串,看起来一样的存储字符串(“DATE_RECEIVED”)。获得所需功能的任何帮助都是非常有帮助的。


编辑: 我增加了一个附加列“时间戳”节省大纪元值(例如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); 
+0

请勿在编辑的解决方案中使用DATETIME(),然后检查它是否有效。 –

回答

0

你有两个选择来做你所要求的。

第一个选项:将DATE_RECEIVED的数据类型更改为INTEGER,然后以毫秒为单位将其初始化。对于twoDaysAgo和今天在params上做同样的事情;将它们转换为毫秒的时间。现在你的查询应该可以工作

第二个选项:检查this的问题。您可能需要更改您的时间戳记格式,但我不确定。

+0

我已经添加了一个额外的列“TIMESTAMP”作为INTEGER - 请参阅我的更新问题。 –