Подтвердить что ты не робот

SQLite сравнить даты

У меня есть этот SQL-Statement:

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

но я получаю некоторые странные результаты, например: 2.02.1990

'Geburtsdatum' - DATE

Любые предложения или решения?

моя таблица-структура:

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) )
4b9b3361

Ответ 1

Из документации:

SQLite не имеет класса хранения, зарезервированного для хранения дат и/или времени.

Итак, ваша колонка точно не хранится как дата. Далее мы узнаем, что столбцы, указанные как DATE, фактически сохраняются как NUMERIC с использованием правила привязки 5.

Возвращаясь к разделу 1.2:

REAL, как число юлианских дней, число дней с полудня в Гринвиче 24 ноября 4714 г. B.C. согласно пролептическому григорианскому календарю.

Хорошо. Поэтому попробуйте:

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

Как ни странно, SQL Fiddle, кажется, сохраняет 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'); 

Ответ 2

У кого-то была такая же проблема и она была решена. (используйте функцию datetime перед сравнением)

См. Сравнение SQLite DateTime

Выдержки: Следуя функции 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')

- EDIT -

В основном вы сравниваете строки. Вот почему неожиданное поведение. Преобразуйте в datetime, используя функцию прямо перед сравнением, и она должна работать.

Ответ 3

Чтобы иметь возможность сравнивать даты, вы должны хранить их в одном из поддерживаемых форматов дат в формате SQLite, таких как строка JJJJ-MM-TT. Ваши даты хранятся в виде строк в локализованном формате даты, который не распознается SQLite.

Если наиболее значимое поле не находится в начале строки, сравнение строк не будет работать для дат.
Со значениями, находящимися в вашей таблице, вы не сможете выполнять какие-либо сравнения.