SQLite DateTimeの比較


117

次のように比較として日時文字列を使用して、sqliteデータベースに対するクエリから信頼できる結果を取得できないようです。

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

sqliteとの日時比較をどのように処理すればよいですか?

更新:フィールドmydateはDateTimeデータ型です


1
mydate列に格納される値の日付形式は何ですか?SQLiteでサポートされている形式の1つではないと思い
OMGポニー

1
OMG、それは日時データ型です
ブラッド

4
datetime()を使用すると、指定した正確な値が得られます。ここで使用する理由はありません。代わりに文字列を使用してください。また、日付のみを処理する場合は、ゼロタイムの部分を削除する必要があります-本質的には、両側が同じ形式であることを確認してください。(それ以外の場合'2009-11-13'、mydateの場合は未満になり'2009-11-13 00:00:00'ます。)

1
SQLiteを備えたVisual Studioが日付/時刻クエリを実行できるようにするには、Datetime()@ Bradが彼のソリューションの言及に含めたのと同じように使用する必要があります。それ以外の場合、VS2012は文句を言います。ブラッドありがとう。
CaptainBli 2013年

ソリューションで更新していただきありがとうございます。.NETの日付のデフォルト形式が実際に「<」対「>」の反対になるというのは、どれほど奇妙なことでしょう。
Dave Friedel

回答:


57

SQLiteには専用の日時はありませんが、いくつかの日時関数があります。これらの関数が理解する文字列表現形式(実際には形式1〜10のみ)に従い(値を文字列として格納)、それらを使用できます。さらに、文字列の辞書式比較は日時比較と一致します(ただし、日付と時刻を比較したり、日付時刻と時刻を比較したりします。これは、とにかくあまり意味がありません)。

使用する言語に応じて、自動変換することもできます。(これは例のようなSQLステートメントの比較には適用されませんが、作業が楽になります。)


10
最初の文を読んでいるすべての人にとって、'17年にはSQLiteにdateanddatetime
alisianoi

3
昨日、ここで型アフィニティについて読みました:sqlite.org/datatype3.html基本的に、日付が必要な場合、内部でとして扱われる列にdate(またはdatetime)を宣言しますtext。それは私のニーズに合います。
alisianoi 2017年

100

この問題を解決するために、日付をとして保存しますYYYYMMDD。したがって、 where mydate >= '20090101' and mydate <= '20050505'

いつでも簡単に機能します。ユーザーが日付を入力する方法を処理するパーサーを作成するだけで、日付をに変換できますYYYYMMDD


2
形式が標準化されている場合、YYYY-MM-DDとダッシュなしの違いはどのようになりますか?比較は同じになりませんか?
デイモン

2
@Damon:彼はデータ型にintを使用していると思います
thumbmunkeys 2011

1
いいえ、これらは文字列です-引用符で確認できます-しかし、これは素晴らしいアイデアです。この順序YY MM DDを使用すると、日付を比較できます。@Damonダッシュも使えるはずです!
Sedat Kilinc、

1
yyyyMMddHHmmssの形式を使用して保存すると、同じことを実行できるので、時間の部分も含めることができますか?それはオーバーフローか何かを引き起こすでしょうか?
ファイサル、2014

2
私は使用します:yyyyMMddHHmmは問題なく、yyyyMMddHHmmssは同じように機能することを期待します
Steve Byrne

39

最近同じ問題が発生し、次のように解決しました:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

%sは一重引用符で囲む必要があります。つまり、strftime( '%s'、date)
mvladic

できます。特定の日付以降のすべての行を選択するようにソリューションを変更:SELECT * FROM table WHERE strftime( '%s'、added)> strftime( '%s'、 "2017-01-01 00:00:00")
新しいプログラマ

strftimeこの例のようにWHERE句での使用を評価していますが、質問がありstrftimeます。このように使用すると効率的ですか?すべての行に対して1回、またはクエリごとに1回評価されますか?
Alvaro Gutierrez Perez

これは正解として受け入れられるべきです!
ルカSh

20

SQLiteを使用すると、次のように問題なく動作します。

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

これは私にとってiOSで機能しました。Objective-C私のクエリは次のとおりです:SELECT COUNT(carSold)FROM cars_sales_tbl WHERE date BETWEEN '2015-04-01' AND '2015-04-30' AND carType = "Hybrid"
Randika Vishman

9

Sqliteは日付を比較できません。秒に変換して整数としてキャストする必要があります。

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;


6

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日の深夜に記録さたデータは含まれていましたが、15日の深夜以降のデータは含まれていませんでした。彼らのクエリがあった場合、

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秒を超える可能性がありますが、ここでの議論には十分です:)


2

タイムゾーン情報を含む時間を保存する必要があり、次の形式でクエリを機能させることができました。

"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

2

以下は日付を比較する方法ですが、その前にDBに保存されている日付の形式を特定する必要があります

日付がMM / DD / YYYY HH:MM形式で保存されているため、その形式で比較する必要があります

  1. 以下のクエリは、日付を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')); 
  2. 以下のクエリでは、大なり演算子(>)を使用します。

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

私が行ったすべての計算は現在の時刻を使用しており、必要に応じて形式と日付を変更できます。

これがあなたを助けることを願っています

まとめた


1

独自のユーザー関数を作成して選択した形式で日付を処理することもできます。SQLiteには、独自のユーザー関数を作成するためのかなり単純な方法があります。たとえば、時間を一緒に追加するためにいくつか書いた。


0

私のクエリは次のように行いました:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

@ifredyの答えからヒントを得ました。私がしたのは、このクエリをiOSでObjective-Cを使用して実行することだけでした。そしてそれはうまくいきます!

iOS開発をしている誰かがこの答えも利用してくれることを願っています!


0

現在、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クエリを更新しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.