14

私はこのSQLステートメントを持っています:

SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum BETWEEN '1993-01-01' AND '2000-01-01'

しかし、次のような奇妙な結果が得られます: 2.02.1990

「Geburtsdatum」は日付です

提案や解決策はありますか?

私のテーブル構造:

CREATE TABLE Kunde (
  Kunde_ID INTEGER NOT NULL ,
  Card INTEGER ,
  Vorname VARCHAR(255) NOT NULL ,
  Nachname VARCHAR(255) NOT NULL ,
  Ort VARCHAR(255) NOT NULL ,
  Strasse VARCHAR(255) NOT NULL ,
  Postleitzahl VARCHAR(10) NOT NULL ,
  Mail VARCHAR(255) ,
  Telefonnummer VARCHAR(255) ,
  Geburtsdatum DATE NOT NULL ,
  Beitrittsdatum DATE NOT NULL ,
  Geschlecht INTEGER NOT NULL ,
  Land VARCHAR(255) NOT NULL DEFAULT 'Österreich' ,
  Bankname VARCHAR(255) ,
  Bankleitzahl VARCHAR(255) ,
  Kontonummer VARCHAR(255) ,
  GroupID INTEGER NOT NULL ,
  Besucher INTEGER ,
  Access BOOLEAN ,
  image BLOB NULL ,
  writeDate DATE ,
  drinkAbo BOOLEAN ,
  PRIMARY KEY (Kunde_ID) )
4

3 に答える 3

18

ドキュメントから:

SQLite には、日付や時刻を格納するためのストレージ クラスが用意されていません。

したがって、列は日付として正確に保存されません。さらに読むと、 として指定された列DATEは、実際にはNUMERICアフィニティ ルール 5 を使用して格納されていることがわかります。

セクション 1.2 に戻ります。

ユリウス日としての REAL。先発グレゴリオ暦による紀元前 4714 年 11 月 24 日のグリニッジ正午からの日数。

良い。それでは、試してみましょう:

SELECT Geburtsdatum FROM Kunde
WHERE Geburtsdatum 
    BETWEEN julianday('1993-01-01') AND julianday('2000-01-01'); 

奇妙なことに、SQL Fiddleは s を文字列として格納DATEしているようで、上記は機能しません。この場合、次のことを行う必要があります。

SELECT Geburtsdatum FROM Kunde
WHERE date(Geburtsdatum)
    BETWEEN date('1993-01-01') AND date('2000-01-01'); 

さらに、あなたの場合、奇妙な(ローカライズされた)フォーマットが返されているようです。あなたの場合も、形式が異なるだけで本当に文字列なのだろうか。あなたは試すことができます:

SELECT Geburtsdatum FROM Kunde
WHERE strftime('%d.%m.%Y', Geburtsdatum)
    BETWEEN date('1993-01-01') AND date('2000-01-01'); 
于 2012-10-26T16:51:48.793 に答える
4

誰かが同じ問題を抱えていて、それを解決しました。(比較の前に日時関数を使用)

SQLite 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')

- 編集 -

基本的に文字列を比較しています。これが、予期しない動作の理由です。比較の直前に関数を使用して日時に変換すると、機能するはずです。

于 2012-10-26T16:44:48.180 に答える
2

日付を比較できるようにするには、文字列など、SQLiteでサポートされている日付形式のJJJJ-MM-TT1つで日付を保存する必要があります。日付は、SQLiteで認識されないローカライズされた日付形式の文字列として保存されます。

最上位フィールドが文字列の先頭にない場合、文字列の比較は日付に対して機能しません。
現在テーブルにある値では、比較を行うことはできません。

于 2012-10-26T18:27:03.903 に答える