日時文字列を比較として使用するsqliteデータベースに対するクエリから信頼できる結果を得ることができないようです:
select *
from table_1
where mydate >= '1/1/2009' and mydate <= '5/5/2009'
sqliteとの日時の比較はどのように処理すればよいですか?
更新:フィールドmydateはDateTimeデータ型です
解決:
日時関数に従い、YYYY-MM-DD HH:mm:ssの文字列形式を使用すると、次のように良好な結果が得られました。
select *
from table_1
where mydate >= Datetime('2009-11-13 00:00:00')
and mydate <= Datetime('2009-11-15 00:00:00')
SQLiteには専用のdatetime types はありませんが、 few datetime functions はあります。これらの関数で理解される文字列表現形式(実際には1-10の形式のみ)に従い(値を文字列として保存)、それらを使用できます日付を時刻と比較するか、日付時刻を時刻と比較してみてください。とにかくあまり意味がありません)。
使用する言語に応じて、 自動変換 を取得することもできます。 (例のようなSQLステートメントの比較には適用されませんが、作業が楽になります。)
この問題を解決するために、日付をYYYYMMDD
として保存します。したがって、where mydate >= '20090101' and mydate <= '20050505'
それはいつもただのWORKSです。ユーザーが日付を入力する方法を処理するパーサーを作成するだけで、YYYYMMDD
に変換できます。
私は最近同じ問題を抱えていましたが、次のように解決しました:
SELECT * FROM table WHERE
strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)
以下は、SQLiteを使用してうまく機能しています。
SELECT *
FROM ingresosgastos
WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"
Sqliteは日付を比較できません。秒に変換して整数としてキャストする必要があります。
例
SELECT * FROM Table
WHERE
CAST(strftime('%s', date_field) AS integer) <=CAST(strftime('%s', '2015-01-01') AS integer) ;
次は私のために働いた。
SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'
最大2日前から今日の終わりまでのデータが必要な状況があります。以下に到着しました。
WHERE dateTimeRecorded between date('now', 'start of day','-2 days')
and date('now', 'start of day', '+1 day')
わかりました。技術的には、データがある場合、元のポスターのように明日の真夜中に引き込みますが、私のデータはすべて履歴です。
重要なことは、最初のポスターでは2009-11-15 00:00:00以降のすべてのデータが除外されたことです。したがって、15日の午前0時に記録されたデータはincludedでしたが、すべてのデータafter15日の深夜はそうではなかった。クエリがあった場合、
select *
from table_1
where mydate between Datetime('2009-11-13 00:00:00')
and Datetime('2009-11-15 23:59:59')
明確にするためにbetween句を使用します。
それは少し良かったでしょう。 1時間に実際に60秒以上かかるうるう秒は考慮されていませんが、ここでの議論には十分です:)
以下は日付を比較する方法ですが、その前にDBに保存されている日付の形式を識別する必要があります
MM/DD/YYYY HH:MM形式で保存された日付があるため、その形式で比較する必要があります
以下のクエリは、日付をMM/DD/YYY形式に変換し、過去5日間から今日までのデータを取得します。 BETWEEN演算子が役立ちます。開始日と終了日を簡単に指定できます。
select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime'));
以下のクエリでは、より大演算子(>)を使用します。
select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');
私が行った計算はすべて現在の時刻を使用しているため、必要に応じて形式と日付を変更できます。
これがあなたを助けることを願っています
要約
タイムゾーン情報を含む時間を保存する必要があり、次の形式でクエリを実行できました。
"SELECT * FROM events WHERE datetime(date_added) BETWEEN
datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"
時刻は、次の形式で通常のTEXTとしてデータベースに保存されます。
2015-03-06 20:12:15 -04:00
独自のユーザー関数 を記述して、選択した形式で日付を処理することもできます。 SQLiteには、独自のユーザー関数を作成するためのかなり簡単な方法があります。たとえば、時間を一緒に追加するいくつかを書きました。
私のクエリは次のようにしました:
SELECT COUNT(carSold)
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"
@ifredyの答えからヒントを得ました。私がしたことは、Objective-Cを使用してiOSでこのクエリを実行したかっただけです。そしてそれは動作します!
IOSの開発を行っている人が、この回答も利用できることを願っています!
現在、System.Data.SQlite NuGetパッケージ(バージョン1.0.109.2)を使用して開発しています。 SQLiteバージョン3.24.0を使用しています。
そして、これは私のために働きます。
SELECT * FROM tables WHERE datetime
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';
Datetime()関数を使用することはできません。おそらく、彼らはそのSQLiteバージョンのSQLクエリをすでに更新しているでしょう。