Datumsfunktionen
Kurz gesagt: In SQLite sind Datumsangaben Text wie 2026-10-25, und date, strftime und julianday addieren Tage, ziehen Jahr oder Monat heraus und zählen die Tage zwischen zwei Daten.
Problem
Bis wann kann ich es zurückgeben?
Ein Kunde schreibt: „Bis wann kann ich meine Bestellung zurückgeben?“ Der Shop gibt 30 Tage ab dem Bestelldatum. Heute ist der 25. Oktober 2026.
Tage im Kalender zu zählen ist langsam, und am Monatsende vertut man sich leicht. Lass die Datenbank rechnen.
Die Idee
Ein Datum plus Tage
Im Shop sind Datumsangaben Text in der Form Jahr-Monat-Tag: 2026-10-25. Das ist der internationale Standard (ISO 8601). Deshalb wurden Datumsangaben bisher richtig sortiert und verglichen.
Die Funktion date(Datum, Änderung) rechnet mit Datumsangaben:
Bestellung 54 kann bis einschließlich heute zurückgegeben werden. Änderungen können Tage, Monate und Jahre sein, vorwärts oder rückwärts, und 'start of month' liefert den ersten Tag des Monats:
Genauer, für Neugierige
Diese Funktionen sind streng bei der Form des Datums. Ohne führende Null (2026-9-30) liefert date NULL, und der Vergleich als Text lügt: '2026-10-25' kommt vor '2026-9-30', weil „1“ vor „9“ kommt. Und '+1 month' vom 31. Januar ergibt den 31. Februar, also den 3. März:
Speichere Datumsangaben also immer mit führenden Nullen und sei vorsichtig, wenn du Monate zu den letzten Tagen eines Monats addierst.
Probier es aus
Die Zahlungsfrist
Neue Bestellungen (new) müssen innerhalb von 3 Tagen nach der Bestellung bezahlt werden. Zeige die Nummer, das Datum und die Frist in einer Spalte namens pay_until.
Lösung
SELECT id, ordered_at, date(ordered_at, '+3 days') AS pay_until FROM orders WHERE status = 'new';date(ordered_at, '+3 days') AS pay_until. Hier prüft die Kontrolle auch die Spaltennamen.
Die Idee
Jahr, Monat, Tag
strftime(Format, Datum) zieht einen Teil des Datums heraus: '%Y' ist das Jahr, '%m' der Monat, '%d' der Tag, '%w' der Wochentag (0 ist Sonntag, 6 ist Samstag).
Das Ergebnis ist Text, mit führender Null: Der Monat ist 03, nicht 3.
Sieh es dir an
Im März angemeldet
Das Marketing will die Kunden, die sich im März angemeldet haben, in irgendeinem Jahr. Führe aus:
Mit derselben Form, Text mit führender Null, kommen zwei heraus:
Die Idee
Wie viele Tage zwischen zwei Daten
julianday(Datum) macht aus dem Datum eine Zahl: wie viele Tage seit einem sehr alten Startdatum vergangen sind. Die Zahl selbst brauchst du nicht, aber die Differenz zweier solcher Zahlen ist die Anzahl der Tage zwischen den Daten.
Wie viele Tage die Küchenprodukte schon im Shop sind:
Genauer, für Neugierige
In einem echten Bericht schreibst du statt '2026-10-25' lieber date('now') oder CURRENT_DATE: das heutige Datum. In SQLite sind beide in UTC, nicht in Ortszeit, deshalb können sich rund um Mitternacht dein lokales Datum und das der Datenbank um einen Tag unterscheiden. Die Lektionen benutzen ein festes Datum, damit das Ergebnis jeden Tag dasselbe ist.
Hat das Datum auch eine Uhrzeit (2026-10-25 18:20:00), funktionieren datetime und time wie date, und julianday liefert auch einen Teil eines Tages: 12 Stunden sind 0.5.
Probier es aus
Bezahlt und wartend
Bezahlte Bestellungen (paid) wurden noch nicht verschickt. Wie viele Tage wartet jede bis zum 25. Oktober 2026? Zeige Nummer, Datum und die Tage in einer Spalte namens waiting, die am längsten wartende zuerst.
Lösung
SELECT id, ordered_at, julianday('2026-10-25') - julianday(ordered_at) AS waiting
FROM orders
WHERE status = 'paid'
ORDER BY waiting DESC;julianday('2026-10-25') - julianday(ordered_at) AS waiting und ORDER BY waiting DESC. Bestellung 9 wartet seit Oktober 2025: Jemand hat sie vergessen. Hier prüft die Kontrolle auch die Reihenfolge.
Übung
Zwei Aufgaben
1. Der Kurier arbeitet sonntags nicht. Welche Bestellungen wurden an einem Sonntag aufgegeben? Zeige Nummer und Datum.
Die Bestellungen, die an einem Sonntag aufgegeben wurden:
Lösung
SELECT id, ordered_at FROM orders WHERE strftime('%w', ordered_at) = '0';WHERE strftime('%w', ordered_at) = '0'. Wieder Text: '0' in Anführungszeichen. Sieben Bestellungen.
2. Welche zugestellten Bestellungen können heute, am 25. Oktober 2026, noch zurückgegeben werden? Zeige Nummer, Datum und die Rückgabefrist in einer Spalte namens return_until.
Die zugestellten Bestellungen, die noch zurückgegeben werden können:
Lösung
SELECT id, ordered_at, date(ordered_at, '+30 days') AS return_until
FROM orders
WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25';WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25'. Zwei Bestellungen, 54 und 56. Für 54 ist heute der letzte Tag, also >= und nicht >.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: SELECT: Spalten auswählen · WHERE: Zeilen filtern · ORDER BY, LIMIT und DISTINCT · Rechnen in einer Abfrage
- Geht weiter in: GROUP BY: ein Bericht nach Gruppen · HAVING: Bedingung für Gruppen · Die Reihenfolge der Ausführung einer Abfrage · Bäume und Folgen: WITH RECURSIVE
- Aufgaben zum Thema: Ausdrücke und Funktionen