Tage zwischen Datumsangaben
Wie viele Tage liegen zwischen zwei Datumsangaben? Sie voneinander abzuziehen funktioniert nicht, und es gibt nicht einmal einen Fehler:
SELECT '2024-01-20' - '2023-01-15' AS tage;| tage |
|---|
| 1 |
Datumsangaben sind Texte, und wenn SQLite mit einem Text rechnen muss, nimmt es die Zahl an seinem Anfang und ignoriert den Rest. Das hier ist also 2024 - 2023, und das ist 1. Datumsangaben müssen zuerst zu Zahlen werden, und das macht julianday(datum): Es liefert die Anzahl der Tage seit einem lange zurückliegenden Tag (dem 24. November 4714 v. Chr., den Astronomen als Tag 0 zählen). Die Zahl selbst ist nicht interessant, aber die Differenz zweier solcher Zahlen ist die Anzahl der Tage zwischen den Datumsangaben:
SELECT julianday('2024-01-20') AS erste_bestellung,
julianday('2023-01-15') AS beitritt,
julianday('2024-01-20') - julianday('2023-01-15') AS tage;| erste_bestellung | beitritt | tage |
|---|---|---|
| 2460329.5 | 2459959.5 | 370.0 |
Emma Becker hat ihre erste Bestellung 370 Tage nach ihrem Beitritt aufgegeben. (Das .5 ist da, weil ein Tag für Astronomen mittags beginnt; in einer Differenz hebt es sich auf.)
Die Differenz ist eine Dezimalzahl, 370.0, denn julianday zählt auch Stunden: julianday('2024-01-20 18:00') ist ein Dreiviertel Tag mehr. Um eine ganze Zahl zu bekommen, wandle sie mit CAST(x AS INTEGER) um. CAST wandelt einen Wert in einen anderen Typ um: INTEGER, REAL oder TEXT. In eine Ganzzahl wandelt es, indem es den Nachkommateil abschneidet, wie die Ganzzahldivision: CAST(3.9 AS INTEGER) ist 3. Datumsangaben ohne Uhrzeit liegen immer ganze Tage auseinander, es geht also nichts verloren. Wie viele Tage war jeder Kunde am Neujahrstag 2025 schon im Shop?
SELECT name, beigetreten,
CAST(julianday('2025-01-01') - julianday(beigetreten) AS INTEGER) AS tage
FROM kunden
LIMIT 3;| name | beigetreten | tage |
|---|---|---|
| Emma Becker | 2023-01-15 | 717 |
| Lukas Neumann | 2023-02-03 | 698 |
| Olivia Braun | 2023-04-21 | 621 |
Du könntest statt CAST auch ROUND benutzen, aber das ergibt 717.0. Und sind die Tage erst eine ganze Zahl, ergibt die Ganzzahldivision ganze Wochen: 717 / 7 ist 102.
Für NULL liefert julianday NULL, wie andere Funktionen auch, ein noch nicht erschienenes Spiel hat also keine Anzahl von Tagen seit seinem Erscheinen. Und julianday('now') ist genau jetzt, sodass julianday('now') - julianday(beigetreten) angibt, wie lange ein Kunde heute schon im Shop ist, eine Zahl, die jeden Tag wächst.
Typischer Fehler: die Datumsangaben in der falschen Reihenfolge. julianday(beigetreten) - julianday('2025-01-01') ergibt für Emma Becker -717.0. Ziehe immer das frühere Datum vom späteren ab.
So schreibst du es:
Anweisungen
- 1
Wie lange war jedes Spiel am Neujahrstag 2026 (
'2026-01-01') schon erhältlich? Zeige den Titel, das Erscheinungsdatum und die Anzahl der Tage alstage_erhaeltlich, als Ganzzahl (48, nicht48.0). Sortiere die Spiele nach dem Erscheinungsdatum, das neueste zuerst:titel erschienen tage_erhaeltlich Knight's Oath 2025-11-14 48 Goal Rush 2025-09-26 97 Turbo Karts 2025-06-05 210 … … … - 2
Zeige darunter, wie viele Tage vor Heiligabend 2025 (
'2025-12-24') die Bestellungen vom November und Dezember 2025 aufgegeben wurden: die ID, das Datum undtage_bis_heiligabendals Ganzzahl. Sortiere die Bestellungen nach dem Datum:id bestellt_am tage_bis_heiligabend 26 2025-11-14 40 27 2025-11-20 34 28 2025-11-28 26 29 2025-12-12 12 30 2025-12-22 2