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

У меня есть этот 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) )
 juergen d26 окт. 2012 г., 18:44
Можете ли вы показать некоторые образцы наSQLFiddle?
 Christian 'fuzi' Orgler26 окт. 2012 г., 18:52
это DATE .. в моем creationscript, также мой sqlite-менеджер покажет мне DATE-тип
 Christian 'fuzi' Orgler26 окт. 2012 г., 18:52
@juergend: в скрипте sql все работает oO
 lc.26 окт. 2012 г., 18:47
Подожди секунду. Из документации: «SQLite не имеет класса хранения, выделенного для хранения дат и / или времени». Так чтоне может быть ДАТА - какая ваша колонка на самом деле?

Ответы на вопрос(3)

и она была решена. (используйте функцию 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')

--РЕДАКТИРОВАТЬ--

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

 rizalp126 окт. 2012 г., 18:49
странный / wi (ə) rd / «Предлагать что-то сверхъестественное; сверхъестественное» ... это расплывчатое слово. Что именно вы видите? Как выглядят ваши значения в таблице?
 rizalp126 окт. 2012 г., 18:53
потому что вы сравниваете строки. Используйте функцию datetime, чтобы преобразовать в дату и затем сравнить.
 Christian 'fuzi' Orgler26 окт. 2012 г., 18:45
это свидание, а не свидание, и я попробовал так и получил странные результаты.
 Christian 'fuzi' Orgler26 окт. 2012 г., 18:50
например Я получаю результат, такой как дата: «13. 02.1990», и это не между 1993 и 2000 годами, верно? :)
Решение Вопроса

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

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

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

НАСТОЯЩЕЕ, как юлианские числа, число дней с полудня в Гринвиче 24 ноября 4714 г. до н.э. согласно пролептическому григорианскому календарю.

Хороший. Так что давайте попробуем:

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

Довольно странно,SQL Fiddle кажется хранитьDATEs как строки и выше не работает. В этом случае следует следующее:

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'); 
 lc.26 окт. 2012 г., 19:04
Интересно, а вау даты смешные в SQLite. Проверьте мою правку.
 Christian 'fuzi' Orgler26 окт. 2012 г., 18:58
Я не сравниваю строки .. Я редактировал вопрос -> структура таблицы. Когда я конвертирую 'Geburtsdatum' в DATE или DATETIME, результат не отображается. Если я только конвертирую «Между значениями», результаты неверны.

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

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

Ваш ответ на вопрос