SQL Abfrage order by String als Datum möglich?

H

Heribert500

Ambitioniertes Mitglied
1
Hallo Leute,

habe eine Datenbank in Benutzung, in der ich Datümer als String speichere (01.01.2000) tt.mm.jjjj
Diese daten möchte ich mit order by asc sortiert ausgeben.
Da ich schon ne Menge Daten drinn habe würde ich vermeiden wollen alle daten neu zu erfassen, bzw. die Struktur der DB zu ändern.
Gibt es eine Möglichkeit einen String als Datum zu sortieren, evtl vorher umzuwandeln
Code:
String orderBy = COL_FREI3G + " ASC, " ;
              Cursor cursor = db.query(TABLE_GEBURTSTAG, null, null, null, null, null, orderBy, null);

danke für euer Antworten

heribert500
 
Du könntest nach einer mit Substring zusammengesetzten Zeichenkette sortieren lassen (etwa so: ORDER BY substring(datum, 7, 4) + substring(datum, 4, 2) + substring(datum, 1, 2)

Das geht aber (je nach selektierter Datenmenge) deutlich zu Lasten der Geschwindigkeit. Sauberer wäre ein entsprechender Datentyp in der Spalte (date) oder Speicherung in yyyyMMdd.


EDIT: Nebenbei: Der Plural von Datum ist Daten, nicht Datümer :smile:

EDIT 2: Falls du deine bestehende Spalte nicht ändern willst, gäbe es ja auch noch die Option eine zusätzliche Spalte einzubauen, die die Daten in entsprechendem sortierbaren Format enthält. Eine Migration der bestehenden Daten ließe sich aber in jedem Fall per Update-Befehl durchführen.
 
  • Danke
Reaktionen: Heribert500
Hallo Thyrion,
danke dir,
werde es als erstes mit substrings versuchen, die Datenmenge wird wohl nicht über 200 Datensätze gehen, wer weiß.

Den Datentyp ändern bedeutet dann ja wohl alle daten neu erfassen ...

und Datümer sind von meiner Sprachgebrauchliste gestrichen.


heribert500
 
SQLITE kennt kein Spaltentyp Date oder Datetime. Du kannst also bei den Strings bleiben und konvertierst die bestehend Daten einmalig.
Neue Daten werden dann auch im neuen Format gespeichert. Ein SQL-konformes Format bietet sich an, ansonsten beginnt der Konvertierungs-Murks
an späterer Stelle evtl. erneut.

0000-00-00T00:00:00 und am besten als UTC-Wert speichern.
Speichern : ts = datetime('now')
Laden : datetime(ts, 'localtime') as ts
 
  • Danke
Reaktionen: Heribert500
Hallo RED-BARON, auch dir ein Dankeschön,

werd ich evtl dann so versuchen.
Im Moment bereitet mir substring (hab auch substr versucht) im DBHelper Probleme.Scheint dort "nicht bekannt zu sein...."
Muß jetzt aber auch ersteinmal weg.

Danke, melde mich dann (Rüchmeldung)


heribert500
 
Hallo zusammen, Rückmeldung

nach vielem Probieren hab ich diese Lösung gewählt
Code:
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_GEBURTSTAG + " ORDER BY SUBSTR(gdatum, 4, 2) ASC, SUBSTR(gdatum, 1, 2) ASC, SUBSTR(gdatum, 7, 4) ASC", null);

Hoffe das ich aus meiner neuen Errungenschaft Java ist auch eine Insel was lerne und sich viele fragen
erübrigen.

heribert500

ps. muss ich einen neuen Thread öffnen oder antwortet man im Ursprungsthread
ich meine weil ja evtl. sonst keiner die Antwort sieht????
 
Gibt es einen Grund, wieso du erst nach Monat, dann Tag und zuletzt Jahr sortierst?

->
TT.MM.JJJJ
01.01.2014
02.01.2014
02.01.2015
03.01.2014
04.01.2014
04.01.2015
...
 
Darf ich auch noch ein Datumsformat vorschlagen? ;)

Dann würde ich den unix timestamp nehmen. Eine Zahl vergleichen geht immer schneller als einen String.

Aber sonst ist es in dem Fall eigentlich egal, was man nimmt. 200 Daten sind schnell durchsucht.
(Bei Datumsangaben macht es immer Sinn die Daten im Format yyyyMMdd zu speichern. So kann man die Werte einfach nach der Größe sortieren (als Interger). Alter Programmiertrick.)
 
Hallo Thyrion und markus.tullius,

das Jahr zu sortieren hatte ich aus dem Vorschlag substrings mit übernommen. Kann man aber auch weglassen.
In der nächsten Datenbank werde ich versuchen eure Vorschläge zu beherzigen.
Das mit yyyyMMdd hatte ich noch nicht versucht.

danke, bis zum nächsten Problem

heribert500
 
Ja, das habe ich gesehen. Mir ging es explizit um die Sortierreihenfolge, die du jetzt verwendest: Monat, Tag, Jahr. Absicht oder nur die Substrings vertauscht?
 
Hi,
ich bin mir nicht ganz sicher, meine Idee war die Liste muss zuerst nach Monat aufsteigend und dann nach Tag aufsteigend sortiert werden.
Is ja ne Geburtstagsliste, die Daten (Datümer :-}) sollten in der Geburtagsreihenfolge da stehen. Also erst alle im Januar, von 1 nach 31, dann
Februar usw.
 
Ah, ok!

Wenn das Jahr irrelevant ist, dann passt das :thumbup: - dann kannt du dir aber auch die Sortierung nach der 3 Spalte (also den 3. Substring) sparen.
 
  • Danke
Reaktionen: Heribert500
Ja, den dritten sub hab ich jetzt rausgenommen.
Danke und schönen Tag noch
 

Ähnliche Themen

B
Antworten
3
Aufrufe
1.313
swa00
swa00
M
  • mafoma63
Antworten
2
Aufrufe
767
swa00
swa00
Manny87
  • Manny87
Antworten
11
Aufrufe
178
swa00
swa00
Zurück
Oben Unten