Datum um x Tage erhöhen

Klemens

Neuer Benutzer
Beiträge
2
Hallo,

ich möchte bei SQLite die Tage, um die das Datum zu erhöhen ist, aus einem Feld übernehmen.
Bei SQL (Test mit mariaDB) wird das so gemacht:
SELECT id, leistung, zeichen, betrag, bis, idclient, alertday FROM Test
Where (date(bis) < curdate() + interval alertday day);

aber wie kann ich das mit SQLite lösen?

Wenn ich statisch 90 Tage eintrage, klappt es, aber die Tage sollen aus dem Feld "alertday" kommen.
Wie wird das bei SQLite gemacht? Hat einer/eine eine Idee?
SELECT id, leistung, zeichen, betrag, bis, idclient, alertday FROM Test
Where date(bis) < date('now', '+90 days');


So geht es nicht:
SELECT id, leistung, zeichen, betrag, bis, idclient, alertday FROM Test
Where date(bis) < date('now', '+alertday days');


Klemens
 
Werbung:
mit '+alertdays days' produzierst Du einen für sqlite unverständlichen Intervall String. *

Ich finde dieses Intervall Schreibweise persönlich auch ätzend und weiß nicht, wieso man sowas erfunden hat. Aber nun..

Du musst die Spalte, die die Intervaltage liefert in den Intervallstring konkatenieren:
'+' || alertdays || 'days'
also
Code:
Where date(bis) < date('now', '+ ' || alertday ||' days');

SQLite ist an der Stelle (und anderen) ziemlich schräg. Es hat keinen eigenen Date Type und arbeitet mit Text im ISO Format xy.
Insgesamt ist es mit dem Thema 'Typ Affinity' ganz anders unterwegs als andere DB, nicht gerade hilfreich, wenn man neu einsteigt. Und auf jeden Fall einen Grund, genau aufzupassen beim SQL Code, auch in Vergleich zu anderen DB.

Und ich merke gerade, dass ich vielleicht was falsch geschrieben habe:
'where date(bis) <..' sollte eigentlich nicht nötig sein, 'where bis < ..' sollte wahrscheinlich(!) reichen. Ich hätte jetzt fast geschrieben, wir wissen nicht, ob Deine Spalte 'Bis' vom Typ Text oder Date ist, aber in SQLite kann sie nur Text sein. Wenn ich es richtig im Kopf habe, hängt aber genau diese Schreibweise auch mit der Version zusammen, Du brauchst ab einer bestimmten Version das date() um Spalte bis nicht. (Weiß ich nicht genau)

* das Gemeine ist, die Auswertung dieses Ausdrucks bringt SQLite dazu, einen NULL Wert auszuspucken, nicht etwa einen Fehler zu melden, weil es alertdays als String im Intervall nicht kennt.
Um solche und ähnliche Probleme einfach zu erkennen, ist es praktisch, Teile oder den gesamten Ausdruck eines Where Kriteriums einfach mit in die Select Clause aufzunehmen und auszugeben. Zumindest dann, wenn nicht das erwartete Ergebnis erscheint. Dort sieht man den Unterschied zwischen "ich hab gedacht, dass " und "Realität".
 
Werbung:
Ich habe das so gelöst, dass der Query einfach gehalten ist und für SQLite sowie SQL nutzen kann. Die Auswertung der Zeiten mach ich in meiner Anwendung. Danke für die Antwort.
 
Zurück
Oben