Date-Funktion in Sqlite

  • Antworten:10
Walter Schnedler
  • Forum-Beiträge: 15

28.02.2012, 21:57:49 via Website

Guten Abend, die Experten!

Ich brauche eure Hilfe :p

Ich habe eine Tabelle, wo Einträge mit einem "pickdate" eingegeben werden.
Jetzt möchte ich die Einträge, die in der Zukunft liegen folgendermaßen ausgeben:

initListView("SELECT _id, Titel || ' (' || Datum || ')' AS Auswahl FROM TEST WHERE Datum >= date('now')");

Doch leider klappt das nicht - ich bekomme bisher nur einen Eintrag von 4 Testeinträgen, die alle in der Zukunft liegen, angezeigt.

Dann möchte ich aus der gleichen Tabelle die Einträge, die in der Vergangenheit liegen in einem Archiv ausgeben...

Das habe ich so versucht:

RMDatabase dbhelper = new RMDatabase();
SQLiteDatabase db = dbhelper.getDatabase();
// Abfrage erstellen. In cur ist das Ergebnis der Abfrage.
Cursor cursor = mDB.getDatabase().query(
RMDatabase.TEST, new String[] { "_id", "Titel", "Datum"},
"Datum < date('now')",
null, null, null, null );



Hier werden leider Einträge angezeigt, die von heute sind, oder auch welche, die als Datum den Wert "29.02.2012" haben.
Kann mir da jemand weiterhelfen?

Antworten
Walter Schnedler
  • Forum-Beiträge: 15

28.02.2012, 22:54:26 via Website

Wo kann ich das nachgucken, bzw. einstellen?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

29.02.2012, 00:01:51 via Website

die als Datum den Wert "29.02.2012" haben

Wenn das so in der Datenbank steht, dann kann dein Vergleich nicht funktionieren:
select date('now')
liefert gerade "2012-02-28" - man beachte die Formatierung :bashful:

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

29.02.2012, 00:24:05 via Website

Ein klein wenig Recherche zu Datumsfunktionen in Sqlite: http://www.sqlite.org/lang_datefunc.html

Und schon kommt man darauf das man folgendes verwenden könnte : SELECT strftime('%d.%m.%Y','now'); --> 28.02.2012

lg Voss

Antworten
Walter Schnedler
  • Forum-Beiträge: 15

29.02.2012, 00:51:26 via Website

Also in der Datenbank ist das Datum folgendermaßen gespeichert:

MM-TT-JJJJ (also z.B. 2-29-2012)
Das Feld "Datum" wird auch als "DATE" gespeichert

Hiernochmal ein Auszug aus der Activity für die Ausgabe der Archiv-ListView

RMDatabase.TEST, new String[] { "_id", "Titel", "Datum"},
"Datum < date('now')",

Und hier für die Ausgabe der ListView für aktuelle/zukünftige Einträge:

initListView("SELECT _id, Titel || ' (' || Datum || ')' AS Auswahl FROM TEST WHERE Datum >= date('now')");


Kann ich mein Problem dadurch lösen, wenn ich aus dem oben zitierten Quellcode etwas ändere,
oder muss ich da was anderes machen? :o

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

29.02.2012, 07:38:37 via Website

Walter, wenn Du die konkreten Tips die AndDev und ich Dir bereits gegeben haben nicht liest, wird es nicht funktionieren.

lg Voss

Antworten
Walter Schnedler
  • Forum-Beiträge: 15

29.02.2012, 14:01:47 via Website

Vielen Dank für die bisherigen Antworten.
Ich habe mal ein bisschen rumprobiert:


Das Datum wird nun in folgendem Format in der Tabelle gespeichert "JJJJ-M-T"
Habe dazu den DatePicker bisschen umgebastelt:

.append(mYear).append("-")
.append(mMonth<10?"0"+(mMonth+1):mMonth + 1).append("-")
.append(mDay<10?"0"+mDay:mDay).append(""));

Die Ausgabe erfolgt dann immernoch wie vorher:

Für aktuelle Einträge:
initListView("SELECT _id, Titel || ' (' || Datum || ')' AS Auswahl FROM TEST WHERE Datum >= date('now')");

Für das Archiv:
Cursor cursor = mDB.getDatabase().query(
RMDatabase.TEST, new String[] { "_id", "Titel", "Datum"},
"Datum < date('now')",
null, null, null, null );


Mit euren Tips konnte ich daher nicht direkt was anfangen.
Trotzdem herzlichen Dank für eure Hilfe!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

29.02.2012, 18:35:14 via Website

Das Datum wird nun in folgendem Format in der Tabelle gespeichert "JJJJ-M-T"
...
Mit euren Tips konnte ich daher nicht direkt was anfangen.

Nicht?
Ist das nicht genau die Umsetzung von "man beachte die Formatierung"?

Im übrigen hast du beim Format hoffentlich "JJJJ-MM-TT" gemeint, denn sonst wird das nach wie vor nicht korrekt funktionieren, da SQLite den Vergleich aufgrund der Affinitäten der Parameter auf String-Ebene durchführen wird.

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

29.02.2012, 20:16:35 via Website

warum nicht einfach einen timestamp speichern?

das komplette format in die db speichern ist ja nicht grade gut überlegt. allein wenn man die app in den usa und europa releasen will.

usa: mm/tt/yyyy
dtl: tt.mm.yyyy

ein timestamp ermöglicht dann einfaches formatieren, je nach locale

swordiApps Blog - Website

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

29.02.2012, 22:29:48 via Website

warum nicht einfach einen timestamp speichern?

Date and Time Datatype

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

Quelle

Oder meinst du etwas anderes?

Ich verwende für sowas normalerweise (also wenn ich Einfluss darauf habe) Unix Time -- Integer ist schnell vergleichbar, sortierbar und hat eine größere Informationsdichte als die vom TE verwendeten Strings.

Antworten