sqllite nach Datum sortieren Datum als VARCHAR

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von DL3AD »

Hallo,

ich möchte nach Datum sortieren - habe folgendes gemacht in der ZQuery

Code: Alles auswählen

SELECT * FROM Log ORDER BY Date

Es wird auch sortiert aber nicht nach Datum sondern Alphabetisch - ist auch richtig so weil das Datum als VARCHAR in der DB abgelegt ist.

Wie bekomme ich nun das nach Datum sortiert - ich verwende eine sqllite DB.

Gruß Frank

Boris
Beiträge: 18
Registriert: Mo 1. Okt 2007, 21:57
OS, Lazarus, FPC: Linux: KDE Neon, Sparky - akt. Lazarus stable, FPC 3.0.2
CPU-Target: 32/64Bit
Wohnort: Rommerskirchen, NRW

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von Boris »

Du könntest bei der Abfrage die varchar Werte in ein Datum konvertieren oder du erweiterst die Datenbank und machst das Feld entsprechend fit.

Für Variante 1) schau mal hier: http://lmgtfy.com/?q=sqlite+convert+varchar+to+date

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von Aliobaba »

Hallo,

ich habe das Datum in dieser Form in der sqlite-DB abgespeichert: 20170709 bzw so: 2017 07 09 .
Damit ist es in der Datenbank leicht sortierbar, weitere "spezielle" Darstellungsmethoden können dann entsprechende Programmroutinen übernehmen.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von DL3AD »

Hallo,

die Datenbank ist vorhanden mit den Inhalten - Datum ist wie folgt abgelegt z.B. 09.06.2017 als VARCHAR.
Nun habe ich folgendes versucht

Code: Alles auswählen

SELECT * FROM Log ORDER BY to_date(Date,'dd/MM/yyyy')

Die Tabelle ist Log und die Spalte mit dem Datum ist Date.
Mit dem SQL Statement in der ZQuery gibt es eine Fehlermeldung.
Was mache ich da falsch ?

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von gladio »

Versuch mal , ich hab gerade keine passende DB

Code: Alles auswählen

 
SELECT * FROM Table ORDER BY date(dateColumn)
 

natürlich mit deinen Tabellen-/Spaltennamen

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von Socke »

sqlite kann das Format dd.mm.yyyy nicht in ein Datum umwandeln, da es das Format nicht kennt.

Daher finde ich die Lösung von Boris ganz gut:
Boris hat geschrieben:Für Variante 1) schau mal hier: http://lmgtfy.com/?q=sqlite+convert+varchar+to+date
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von DL3AD »

ich habe nun folgendes Statement verwendet - da mäckert er nicht

Code: Alles auswählen

SELECT * FROM Log ORDER BY date(Date)

aber es wird nicht sortiert - habe es in Lazarus versucht und auch mit SQLiteStudio
Bei dem Link von Boris kommt Google - gesucht hatte ich natürlich schon selbst.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von gladio »

habe gerade mit SQLite Admin eine Test-DB angelegt

mein Vorschlag ... order by date(date) macht nix, keine Sortierung, keine Fehlermeldung

to_date wird als Fehler angezeigt

eventuell ist auch der Spaltenname 'date' nicht gerade günstig gewählt

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von Socke »

DL3AD hat geschrieben:Bei dem Link von Boris kommt Google - gesucht hatte ich natürlich schon selbst.

Wonach hattest du denn gesucht?
Wenn du dem ersten von Google gefunden Link gefolgt wärst, wüsstest du, wie du dein Datum in ein für SQLite verwertbares Format bringst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von DL3AD »

1. Datum ist wie folgt abgelegt z.B. 09.06.2017 als VARCHAR und es muss auch so bleiben.
2. Ich habe gesucht und verschiedene Sachen ausprobiert und hatte keinen Erfolg.

Wie kann man ein Datum in dieser Form 09.06.2017 konvertieren um es mit SQL zu sortieren ?
Sämtliche Konvertierungsversuche sind bei mir gescheitert.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von DL3AD »

Hallo,

soo habe nix konvertiert sondern den Feldinhalt zelegt und dann sortiert - nun funktioniert es

Code: Alles auswählen

SELECT * FROM Log ORDER BY SubStr(Date,7,4), SubStr(Date,4,2), SubStr(Date,1,2)


trotzdem Danke für eure Hilfe

Gruß Frank

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: sqllite nach Datum sortieren Datum als VARCHAR

Beitrag von wp_xyz »

Lt SQLite3 Docs wird bei Datums-Strings als Datumstrenner ein Bindestrich erwartet (https://sqlite.org/datatype3.html, https://sqlite.org/lang_datefunc.html). Daher kannst du auch mit REPLACE den Punkt gegen einen Bindestrich austauschen und dann der DATE-Funktion übergeben:

Code: Alles auswählen

    QrySales.SQL.Add('SELECT * FROM Sales ORDER By DATE(REPLACE(DateSold, ".", "-"))');


[EDIT]
Blödsinn - in meiner Test-DB hatte ich Jahr, Monat und Datum in der gewünschten Reihenfolge "Jahr-Monat-Tag" - bei dir ist sie ja umgekehrt "Tag.Monat.Jahr". Deine oben selbst vorgeschlagene Lösung erscheint mir die beste zu sein.

Antworten