web-dev-qa-db-fra.com

Dates de comparaison SQLite

J'ai cette instruction SQL:

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

mais j'obtiens des résultats étranges, comme: 2.02.1990

'Geburtsdatum' est une date

Des suggestions ou des solutions?

ma structure de table:

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) )
12

De la documentation:

SQLite n'a pas de classe de stockage réservée pour stocker des dates et/ou des heures. 

Donc, votre colonne n'est pas exactement stockée comme une date. En poursuivant la lecture, nous apprenons que les colonnes spécifiées comme DATE sont en réalité stockées sous la forme NUMERIC à l'aide de la règle d'affinité 5.

En remontant à la section 1.2:

RÉEL en nombre de jours juliens, le nombre de jours écoulés depuis midi à Greenwich le 24 novembre 4714 av. selon le calendrier proleptique grégorien. 

Bien. Alors essayons:

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

Curieusement, SQL Fiddle semble stocker DATEs sous forme de chaînes et ce qui précède ne fonctionne pas. Dans ce cas, les éléments suivants doivent:

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

En outre, dans votre cas, vous semblez recevoir un format étrange (lu: localisé). Je me demande si c'est vraiment une chaîne dans votre cas aussi, mais avec un format différent. Tu pourrais essayer:

SELECT Geburtsdatum FROM Kunde
WHERE strftime('%d.%m.%Y', Geburtsdatum)
    BETWEEN date('1993-01-01') AND date('2000-01-01'); 
18
lc.

Quelqu'un a eu le même problème et l'a résolu. (utilisez la fonction datetime avant la comparaison)

Voir Comparaison SQLite DateTime

Extrait: Suivant la fonction datetime et ayant un format de chaîne tel que AAAA-MM-JJ HH: mm: ss i obtenu de bons résultats comme suit

select * 
  from table_1 
  where mydate >= Datetime('2009-11-13 00:00:00') 
  and mydate <= Datetime('2009-11-15 00:00:00')

--MODIFIER--

Vous comparez essentiellement des chaînes. C'est pourquoi le comportement inattendu. Convertir en date-heure en utilisant la fonction juste avant la comparaison et cela devrait fonctionner.

4
rizalp1

Pour pouvoir comparer les dates, vous devez les stocker dans l’un des formats de date pris en charge SQLite pris en charge , comme une chaîne JJJJ-MM-TT. Vos dates sont stockées sous forme de chaînes dans un format de date localisé qui n'est pas reconnu par SQLite.

Si le champ le plus significatif n'est pas au début de la chaîne, les comparaisons de chaînes ne fonctionneront pas pour les dates.
Avec les valeurs actuellement dans votre tableau, vous ne pourrez faire aucune comparaison.

0
CL.