2017-04-08 6 views
0

私のAndroidプロジェクトには、の日付のKEY_DATEフィールドがあるSQLテーブルがあります。日付(月)でソートするJavaのSQLステートメント

KEY_DATE + "DATE"

私のテーブルは、Javaコード(日付DD/MM/YYでフォーマット)から移入されます。 これで、日付関連のクエリをいくつか作成する必要があり、何かが動作していません。 今日、今月、今年のテーブルから選択する必要があります。 は、ここに私が試したものです。その期間のための多くのデータがありますにもかかわらず

 DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"); 
    Date todayD = new Date(); 
    dateFormat.format(todayD); 
    String today = dateFormat.format(todayD); 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.DAY_OF_MONTH, 1); 
    Date firstDay = cal.getTime(); 
    dateFormat.format(firstDay); 

    String selectQuery = "SELECT * FROM " + TABLE_PAYMENTS + "WHERE " 
    + KEY_DATE +" BETWEEN " + firstDay + " AND " + today; 

クエリは空を返します。 ここでデータフォーマットに何か問題があると私は考えています。これを解決するのを手伝ってもらえますか? ありがとうございます。

+0

「selectQuery」を出力してください。答えは明らかです。 –

+1

クエリを書くときの日付(yyyy-MM-dd)には常にISO形式を使用することをお勧めします。日付も引用する必要があります。そうでない場合は、除算操作として解釈されます。また、日付範囲を扱うときは、 "date> = firstDayとdate lpacheco

答えて

3
  1. あなたはfirstDをフォーマットしていないあなたのため、月の初日から取得する現在時刻はです。
  2. クエリの日付の前後に単一引用符を使用するか、プリペアドステートメントを使用する必要があります。そうしないと、サーバーは日付を数学演算として認識します。
  3. 日付範囲を問い合せるときに、日付に1時間を指定しないと、SQLではデフォルトで0時間(0:00:00.0000)になります。 「開始日と今日の間に」を使用すると、今日の真夜中になります。 「startDateとtomorrowの間」を使用すると、明日の真夜中になります。適切な範囲を取得するには、 "日付> = startDateと日付<明日"を使用する必要があります。
  4. 日付を含むクエリを書くときは、常に日付文字列にISO形式を使用することをお勧めします.yyyy-MM-dd。

    calendar cal = Calendar.getInstance(); DateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd");

    date todayD = new Date(); cal.setTime(todayD); cal.add(Calendar.DATE、1); 日付tomorrowD = cal.getTime(); 文字列today = dateFormat.format(tomorrowD);

    cal.set(Calendar.DAY_OF_MONTH、1); 日付firstD = cal.getTime(); 文字列firstDay = dateFormat.format(firstD);

    文字列selectQuery = "SELECT * FROM TABLE_PAYMENTS WHERE KEY_DATE> =" "+ firstDay +" 'AND KEY_DATE < "+ today +"' ";

+1

#3項目は、開始が* inclusive *で終わりが* exclusive *である「Half-Open」アプローチとして知られています。時間のスパンを定義するための賢明な方法。 –

2

問題は、データベース内に存在するデータの日付形式と、SQLクエリに渡す(文字列)日付形式にあります。

文字列パラメータSQLクエリにとして日付を渡すことをお勧めではないので、以下に示すように、私は強くpreparedStatementを使用することをお勧め:

Date todayD = new Date(); 
Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.DAY_OF_MONTH, 1); 
Date firstDay = cal.getTime(); 
String selectQuery = "SELECT * FROM TABLE_PAYMENTS WHERE BETWEEN ? AND ?" ; 

//create preparedStatement here 

preparedStatement.setDate(1, firstDay); 
preparedStatement.setDate(2, todayD); 
+0

厄介な古い日時型を使用する以外は妥当な答えです。 JDBC 4.2以降に準拠したJDBCドライバは、 'ResultSet :: getObject'メソッドと' PreparedStatement :: setObject'メソッドを介してjava.time型を直接扱うことができます。 –