2012-01-07 6 views
1

ローカルのSQLiteデータベースで日付関連のクエリを実行する際に大きな問題に直面しています。Android SQLite日付クエリの問題、2つの日付間でレコードを比較できない

私は、特定の年と月内にeventdateを持つすべてのイベントを取得しようとしています。これを行うには、その月の最初の日付と最後の日付を計算し、イベントの日付がこの範囲内のどこにあるかを照会しました。

私のテストデータが使用: のString [] testEventDates = { "2011-12-17"、 "2012-02-25"、 "2012-01-10"、 "2012-01-01"、 " 「2011-12-24」、「2012-02-25」}

しかし、以下のクエリを実行すると、これらのエントリがすべて取得されますが、これは間違っています。私のクエリは、(SELECT ... WHERE) "eventDate> =" + firstDayです。

私は他の制限を追加し、 "AND『EVENTDATE <』+ LASTDAY、 それも不気味に動作し、カーソルが代わりにnullである。あなたがこのことについてどんな手掛かりを持っている場合

私を助けてください!

// fetch events by month, between first and last days calculated 
public Cursor fetchEventsByMonth(int month, int year) { 
    String firstDay, lastDay, correctedMonth; 

    if (month == 12) { 
     lastDay = Integer.toString(year+1) + "-01-01"; 
    } else{ 
     if (month+1 < 10) { 
      correctedMonth = "0" + Integer.toString(month+1); 
      } else correctedMonth = Integer.toString(month+1); 
     lastDay = Integer.toString(year) + "-" + correctedMonth 
       + "-01"; 
    } 
    if (month < 10) { 
     correctedMonth = "0" + Integer.toString(month); 
     } else correctedMonth = Integer.toString(month); 
    firstDay = Integer.toString(year) + "-" + correctedMonth + "-01"; 
    firstDay = "2012-02-25"; 

    Cursor mCursor = 
    mDb.query(DATABASE_TABLE_EVENTS, new String[] { KEY_EID, KEY_ENAME, 
      KEY_EINTERESTS, KEY_EBENS, KEY_EDATE, KEY_ETIME, KEY_EVHO, KEY_EABBR, 
      KEY_ELOCATION, KEY_ETYPE, KEY_ENATURE, KEY_ESTATUS, 
      KEY_ESIGNEDUP, KEY_ECAPACITY}, "eventDate >= " + firstDay 
      // + " AND "eventDate < " + lastDay 
        , null, null, null, 
      "eventDate"); 
    if (mCursor != null) mCursor.moveToFirst(); 

    return mCursor; 
} 

答えて

2

あなたが直接クエリを再現してみました(私はSQLiteのマネージャーのようないくつかのツールを使用してデータベースを照会することを意味する)

NB:?!あなたは、単一引用符を使用することが常にあなたが持っている文字列を使用している また、選択と選択の引数を使用するように変更したので、安全性が向上し、単一引用符が自動的に挿入されます。 それを試してみてくださいだからあなたのクエリがなければならない:

Cursor mCursor = 
    mDb.query(DATABASE_TABLE_EVENTS, new String[] { KEY_EID, KEY_ENAME, 
      KEY_EINTERESTS, KEY_EBENS, KEY_EDATE, KEY_ETIME, KEY_EVHO, KEY_EABBR, 
      KEY_ELOCATION, KEY_ETYPE, KEY_ENATURE, KEY_ESTATUS, 
      KEY_ESIGNEDUP, KEY_ECAPACITY}, "eventDate >= ? AND eventDate < ?" 
        , new String[] { firstDay, lastDay}, null, null, 
      "eventDate"); 
    if (mCursor != null) mCursor.moveToFirst(); 

も本当に大きなアドバイスは、文字列で日付と時刻を格納したことがないことです。まず第一に、このように静的であるため、異なる時間とタイムゾーンで人々が異なる国に住んでいると考える必要があるため、世界中で考えなければなりません:)

日付と時刻を保存する最良の方法(私の意見では)長い(タイムスタンプ)。 日付/時刻を取得するときに、DateコンストラクタまたはCalendarコンストラクタに直接渡すことができます。また、それは多くの方法で日付を比較するのがはるかに簡単で、文字列比較よりもはるかに高速です。

+0

おかげStermiする必要があります!それを今から試してみると、現在の月には動作しますが、それ以外の月にはまだ動作しません。 –

+0

奇妙な結果: 2012年1月:2012-01-10(2012-01-01行方不明)||| 2012年2月:無制限(2012-02-25欠落)||| 2011年12月:2011-12-17、2011-12-24、 2011-12-25、2011-12-25、2011-12-26(これらの3つはDBにはありません。 〜から?) –

+0

ありがとうstermi !!!それはうまくいく、私の奇妙な結果は私のDBが私のデバイスで時代遅れであるため、私はいつもそれを削除し、毎回新しいAVDを作成する必要があります...:p –

0

SQLiteのstrfttime()関数を使用して文字列の日付を書式設定する必要があります。リンク。

http://www.sqlite.org/lang_datefunc.html

は、それが

+0

OKおかげでラヴィ、今試してみよう! –

0

はあなたが唯一の月と年を扱うことができる場所

SQLiteのテーブルに提出された日はTEXTになりますここに私の例では、完全な日付を扱っている、これを試してみて、お役に立てば幸いです日付データは "2012-12-31 00:12:00"形式で保存する必要があります。比較では問題はありません。フィールドがdate_fromとdate_toであるとみなし、現在の日付をto_dateに格納している場合は、現在の日付日記は

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String to_date = sdf.format(new Date()); 

とSQLクエリは

crs = db.rawQuery(
    "SELECT _id, date_from, date_to, done_or_not, list_name " + 
    "FROM list_tbl " + 
    "WHERE " + 
    "date_from <= Datetime('"+to_date+"') AND date_to >= Datetime('"+to_date+"')", null); 
関連する問題