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) )
Ответы
Ответ 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.
Если наиболее значимое поле не находится в начале строки, сравнение строк не будет работать для дат.
Со значениями, находящимися в вашей таблице, вы не сможете выполнять какие-либо сравнения.