2017-04-19 9 views
0

私は無数の投稿を行ってきましたが、依然として望みの結果を達成できていないようです。AndroidのSQLiteの日付のクエリ

私の日付/タイムスタンプは、1つのようになりますSQLiteデータベース内の文字列として格納されます。日4月16日夜12時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」)と同じように見える文字列のフォーマットされます。目的の機能を動作させるための助けがあれば、大きな助けとなります。


EDIT: (ジャストタイムスタンプの後の項目を示して)私はエポック値を保存し、追加の列「TIMESTAMP」(例えば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

あなたが求めたことを行うには、2つの選択肢があります。

最初のオプション:DATE_RECEIVEDのデータ型をINTEGERに変更し、ミリ秒単位で初期化します。 twoDaysAgoと今日のparamsで同じことをする;ミリ秒単位で時間に変換します。今すぐあなたのクエリが動作するはずです。

第2オプションthisを確認してください。このためにタイムスタンプ形式を変更する必要があるかもしれませんが、わかりません。

+0

INTEGERとして追加の列 'TIMESTAMP'が追加されました。最新の質問をご覧ください。 –

関連する問題