18

String次の形式で、データベースと同じように日付を保存します。

YYYY-MM-DD HH:MM:SS

これは、サポートされている形式の 1 つです ( http://www.sqlite.org/lang_datefunc.html )。ここで、これらの保存された日付 (文字列) を別の日付と比較したいと思います。私の日付は columncolumn_dateに保存されているので、これを試しています:

SELECT  * FROM MyTable
WHERE 
(Date(column_date) >= Date (2000-01-01) AND Datetime(column_date) <= Datetime (2050-01-01))

ドキュメントを読んでいるThe date and time functions use a subset of IS0-8601 date and time formats. The date() function returns the date in this format: YYYY-MM-DD.ので、私はそれを正しくやっていると思います-保存された文字列から日付を作成し、それを別の文字列から作成された日付と比較します。

column_dateしかし、今年の日付であっても機能しません。ご覧のとおり、開始日と終了日は非常に好意的です。これも試しました(日付の代わりに日時を使用):

SELECT  * FROM MyTable
    WHERE 
    (datetime(column_date) >= Date (2000-01-01) AND datetime(column_date) <= Datetime (2050-01-01))

とこれ (<= と >= の代わりに between を使用)

SELECT  * FROM MyTable
    WHERE 
    (Date(column_date) between Date (2000-01-01) AND Datetime (2050-01-01))

および他のすべての可能な組み合わせ。私は何を間違っているのですか、私は愚かですか、それともドキュメントが嘘をついているのですか、それとも非常に重要なことを見逃しているのですか? 数時間解決策を見つけようとしていますが、何もうまくいきません...

4

5 に答える 5

22

日付を次の形式の文字列として保存している場合

YYYY-MM-DD HH:mm:ss  

====> 日付フィールドは DateTime データ型です

したがって、そのようなクエリを使用する必要があります

select * 
  from MyTable 
  where mydate >= Datetime('2000-01-01 00:00:00') 
  and mydate <= Datetime('2050-01-01 23:00:59')

@Joop Eggen によって与えられたスニペットを、同じアプローチの演算子で使用することもできます。

BETWEEN演算子は、一対の比較と論理的に同等です。「x BETWEEN y AND z」は「x>=y AND x<=z 」と同等ですが、BETWEEN では x 式が 1 回だけ評価される点が異なります。sqlite3のドキュメントを参照してください

于 2012-05-31T12:02:36.070 に答える
7
SELECT *
FROM MyTable
WHERE 
    column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59'

トリックを行う必要があります。これは文字列のみを使用しますが、それが適切だとおっしゃいました。

エラーは、時刻部分が欠落しているか、日付部分のみで substr を実行していないことでした。そして、データ/時間変換関数も間違った結果をもたらす可能性があります。

于 2012-05-31T11:47:46.327 に答える
3

あなたの問題はここにあると思います...

AND Datetime(column_date) <= Datetime (2050-01-01))

ここでDateの代わりにDatetimeを使用しているのはなぜですか?

これを試して:

SELECT  * FROM MyTable WHERE (Date(column_date) >= Date (2000-01-01) AND Date(column_date) <= Date (2050-01-01))
于 2012-05-31T11:50:26.423 に答える
2

SQLite テーブルに入力された日付は TEXT になり、日付データは "2012-12-31 00:12:00" 形式で保存する必要があります。その比較で問題が発生することはありません。 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);
于 2012-12-31T17:29:46.170 に答える