1

データベースでは、日付を Year、Month、Day_of_Month の 3 つの列の形式で保存しました (日付を保存するのが最善の方法ではないことはわかっていますが、この形式が適していると思われる他の特定のクエリを作成します)。

ここで、日付が指定された 2 つの日付の間にあるすべての行を取得したいと考えています。以前のスタックオーバーフローの質問を確認しましたが、ほとんどの質問は日付を単一のエンティティとして保存しています。

これが私が試した方法です:

すべての列名が宣言された MySqLiteHelper クラスがあります。そこにテーブルも作ります。COLUMN_DATE_YEAR、COLUMN_DATE_MONTH、および COLUMN_DATE_DAY は、列名を格納する文字列です。

      int fyear, fmonth, fday; // I populate those initial date values
      int tyear, tmonth, tday; // I populate those target date values

      String selection = MySQLiteHelper.COLUMN_DATE_YEAR + " >= '"+fyear+"' AND "+ MySQLiteHelper.COLUMN_DATE_DAY + " >= '"+fday+"' AND "
              + MySQLiteHelper.COLUMN_DATE_MONTH + " >= '"+fmonth+"' AND " + MySQLiteHelper.COLUMN_DATE_YEAR + " <= '"+tyear+"' AND "
              + MySQLiteHelper.COLUMN_DATE_DAY + " <= '"+ tday+"' AND "+ MySQLiteHelper.COLUMN_DATE_MONTH + " <= '"+tmonth+"'";

      String []column = {MySQLiteHelper.COLUMN_MOOD_LEVEL};
      Cursor cursor = database.query(MySQLiteHelper.TABLE_NAMES, column, selection, null, null, null, null);

このアプローチの問題点は、2013 年 2 月 25 日から 2013 年 3 月 17 日までのクエリに対して、月が 2 < 3 であっても、25 日 > 17 日の結果が得られないことです。これには、何らかのネストされた where 句が必要になる場合があります。ただし、「.query」メソッドを使用してネストされた「Where」を形成できません。

これら 2 つの日付の間に格納されたエントリを照会する方法を提案してください。前もって感謝します。

4

3 に答える 3

2

次のように、やや複雑な WHERE 句を実行できない理由はありません (日付 >= 2013-02-17 の場合)。

( YEAR > 2013 OR ( YEAR = 2013 AND ( MONTH > 2 OR ( MONTH = 2 AND DAY >= 17 ) ) ) )

これは機能しますが、最適からです。データベースの設計を修正したほうがよいでしょう。

修正:データベースの設計を修正する必要があります。日付をDATEtype または ISO string:として保存しますyyyy-mm-dd

おまけ:あなたは今、次のものを持っているとしましょう:

CREATE TABLE theTable( 
    ....
    THEYEAR TEXT,
    THEMONTH TEXT,
    THEDAY TEXT );

日付を使用可能な形式に変換するには、次のコマンドを実行するだけです。

ALTER TABLE theTable
  ADD COLUMN THEDATE TEXT;

UPDATE theTable
    SET THEDATE = THEYEAR || substr( '0' || '-' || THEMONTH, -2, 2 ) || '-' || substr( '0' || THEDAY, -2, 2 );

それが完了したら、BETWEEN句を使用してクエリを実行できます。

于 2013-03-17T15:24:00.527 に答える
1

現在のスキーマを使用して、WHERE 句の順序を変更してみてください。年、月、など、最初に最大の列を比較する必要があります。現在の年、、月では、新しい月にまたがる日付を正確に比較することはできません。
例: day >= 25 and day <= 17 は無効な範囲を作成します。正しい範囲を考慮していません: >25、1 にラップ、次に <17...

于 2013-03-17T15:36:34.693 に答える
0

テーブル構造を変更しなくても、以下のクエリが機能します。試してみてください

select * from TableName WHERE (10000*ColumnYear+100*ColumnMonth+ColumnDay >= 20131009) and (10000*ColumnYear+100*ColumnMonth+ColumnDay <= 20131121);
于 2013-11-21T10:41:17.690 に答える