Level 6: Mit Text und Datum arbeiten

Level 6: Mit Text und Datum arbeiten

Aktualisiert am

Anfänger · Level 6 von 20. Ziel: Texte umwandeln und Informationen aus Datumswerten gewinnen.

Themen: UPPER LOWER LENGTH || SUBSTR strftime date julianday

Lektion

SQL kann Texte umwandeln. UPPER und LOWER setzen einen Text in Groß- oder Kleinbuchstaben, was hilft, schlecht erfasste Daten wie „bob durand“ oder „CLAIRE ROUX“ zu vereinheitlichen. LENGTH liefert die Anzahl der Zeichen.

SUBSTR(Text, Start, Länge) schneidet ein Stück aus einem Text heraus. Das erste Zeichen steht an Position 1, nicht 0: SUBSTR('Paris', 1, 3) ergibt 'Par'.

Der Operator || hängt Texte aneinander: name || ' (' || city || ')' ergibt „Lena (Lyon)“. Vorsicht: Ist einer der verketteten Werte NULL, wird das ganze Ergebnis NULL.

In SpeedQL (SQLite) ist ein Datum ein Text im Format 'JJJJ-MM-TT'. Dieses Format hat einen großen Vorteil: Die alphabetische Reihenfolge ist auch die chronologische. Man vergleicht Datumsangaben also direkt: '2025-03-01' < '2025-04-15'.

Um einen Teil eines Datums herauszuziehen, verwendet man strftime(Format, Datum). '%Y' liefert das Jahr, '%m' den Monat, '%d' den Tag, '%Y-%m' Jahr und Monat. strftime('%Y', joined) ergibt zum Beispiel '2022'. Das Ergebnis ist ein Text: Man vergleicht es mit '2022', in Anführungszeichen.

Um ein Datum zu verschieben, verwendet man date(Datum, Verschiebung): date('2025-07-01', '+1 day') ergibt '2025-07-02'. Verschiebungen schreibt man '+7 days', '-1 month' oder '+1 year'. strftime akzeptiert dieselben Verschiebungen nach dem Datum.

Um einen Abstand zu messen, wandelt julianday(Datum) ein Datum in eine Anzahl von Tagen um. Die Differenz zweier julianday-Werte ergibt also einen Abstand in Tagen: julianday(return_date) - julianday(loan_date) liefert die Dauer einer Ausleihe.

Schließlich wandelt CAST(value AS type) einen Wert von einem Typ in einen anderen um: CAST(strftime('%Y', joined) AS INTEGER) liefert die Zahl 2022 statt des Textes '2022', mit der man dann rechnen kann (zum Beispiel eine Betriebszugehörigkeit).

Syntax

SELECT UPPER(name),
       name || ' - ' || stadt,
       SUBSTR(text, 1, 4),
       strftime('%Y', datum_spalte),
       date(datum_spalte, '+7 days')
FROM meine_tabelle;

Kommentiertes Beispiel

SELECT name || ' (' || city || ')' AS label, strftime('%Y', joined) AS join_year
FROM members;

Wir bauen eine lesbare Beschriftung aus Name und Stadt und lesen das Beitrittsjahr aus.

Tabelle members (6 Zeilen)
idnamecityjoined
1LenaLyon2022-01-15
2MarcParis2021-06-03
3NadiaLyon2023-03-20
4OscarLille2020-11-11
5PaulaParis2024-02-01
6QuentinNantes2023-09-09

Ergebnis des Beispiels

labeljoin_year
Lena (Lyon)2022
Marc (Paris)2021
Nadia (Lyon)2023
Oscar (Lille)2020
Paula (Paris)2024
Quentin (Nantes)2023

Das Wichtigste

  • || verkettet Texte.
  • SUBSTR zählt ab 1.
  • strftime liest einen Teil eines Datums aus, julianday berechnet Abstände.

Häufige Fallen

  • strftime liefert Text: Vergleiche mit '2023', in Anführungszeichen.
  • Ein Datum mit Uhrzeit ist „größer“ als das Datum allein: '2025-06-05 10:00' > '2025-06-05'. departs BETWEEN '2025-06-01' AND '2025-06-05' übersieht also die Flüge vom 5. Juni. Schreibe departs < '2025-06-06' als Endgrenze.
  • Ist einer der mit || verketteten Werte NULL, wird das ganze Ergebnis NULL.

SQLite-Besonderheit

SQLite hat keinen echten Datumstyp: Ein Datum ist ein Text im Format 'JJJJ-MM-TT', und strftime, date und julianday gibt es nur in SQLite. Andere Datenbanken haben einen Typ DATE und andere Funktionen (EXTRACT, DATE_TRUNC, DATEDIFF…).

Weiterführend

TRIM(text) entfernt Leerzeichen am Anfang und am Ende; REPLACE(text, '-', '/') ersetzt jedes Vorkommen; INSTR(text, '@') liefert die Position eines Zeichens (0, wenn es fehlt). Kombiniert: SUBSTR(email, INSTR(email, '@') + 1) zieht die Domain einer Adresse heraus ('mail.com').

Die 5 Übungen des Levels

  1. Geführt · Zeige den Namen jedes Kontakts in Großbuchstaben (name_upper) und seine Zeichenanzahl (name_length). (Tabelle: contacts)
  2. Training · Zeige für jeden Hotelgast eine Spalte guest im Format „Name - Land“ (zum Beispiel „Ana Silva - Portugal“). (Tabelle: guests)
  3. Training · Zeige die Fluggesellschaft und die Abflugzeit jedes Flugs (zum Beispiel 08:10) in einer Spalte namens hour. (Tabelle: flights)
  4. Training · Zeige den Namen der Mitglieder, die 2023 beigetreten sind. (Tabelle: members)
  5. Herausforderung · Eine Ausleihe dauert höchstens 21 Tage. Zeige für die verspätet zurückgegebenen Ausleihen die ID, das Rückgabedatum laut Frist (due_date), das tatsächliche Rückgabedatum und die Anzahl der Verspätungstage (days_late). (Tabelle: loans)

In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.

Die Übungen von Level 6 machen

Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.

Level 6 in SpeedQL öffnen

·