Daten und Zeit sind nicht einfach nur abstrakte Zahlen, sondern der Schlüssel zu einem wertvollen Teil deiner Infos. Im echten Leben stolperst du ständig über Daten: zum Beispiel beim Analysieren von Verkäufen pro Monat, beim Filtern nach dem Geburtsdatum von Mitarbeitenden oder beim Vergleichen von Zeitintervallen. Wenn du weißt, wie du mit Daten jonglierst, kannst du flexiblere Abfragen bauen und richtig coole Analysen machen.
Beispiele, wo das Arbeiten mit Daten mega wichtig ist:
- Analyse der Verkäufe für einen bestimmten Monat.
- Zählen, wie viele User sich im letzten Jahr registriert haben.
- Berichte über Zeitintervalle erstellen (zum Beispiel monatliche Einnahmen).
In PostgreSQL gibt’s jede Menge Funktionen für Daten, und wir schauen uns jetzt nur die praktischsten davon an.
Wichtige Funktionen für Daten und Zeit
Die Funktion NOW() gibt dir das aktuelle Datum und die aktuelle Uhrzeit vom Datenbankserver zurück. Die benutzt du, wenn du wissen willst, wie spät es gerade ist. Beispiel: Du willst die Erstellungszeit eines neuen Eintrags speichern.
SELECT NOW();
Beispiel-Ergebnis:
2023-11-05 15:23:45.123456+00
Beispiel für die Nutzung: Du willst einen Bestell-Eintrag mit aktuellem Datum und Uhrzeit speichern:
INSERT INTO orders (order_id, order_date, total_amount)
VALUES (1, NOW(), 150.00);
Kommentar: Hier
NOW() fügt automatisch das aktuelle Datum und die aktuelle Uhrzeit in die Spalte
order_date ein.
Wie genau der INSERT-Operator funktioniert, erfährst du in den nächsten Vorlesungen :P
Die Funktion CURRENT_DATE
Wenn du nur das aktuelle Datum ohne Uhrzeit brauchst, nimm CURRENT_DATE. Die gibt dir nur Jahr, Monat und Tag zurück.
Syntax:
SELECT CURRENT_DATE;
Beispiel-Ergebnis:
2023-11-05
Beispiel für die Nutzung: Sagen wir, du willst alle Einträge vom heutigen Tag holen:
SELECT *
FROM orders
WHERE order_date = CURRENT_DATE;
Kommentar: Hier vergleichen wir das Datum aus der Spalte
order_date mit dem aktuellen Datum.
Kleiner Spaß am Rande. NOW() ist wie dein Kaffee im Büro: sofort bereit. Und CURRENT_DATE ist wie der Kalender an der Wand: nur das Datum, keine Extras.
Datumsteile extrahieren mit DATE_PART()
Die Funktion DATE_PART() holt dir einen bestimmten Teil eines Datums raus, zum Beispiel Jahr, Monat, Tag, Stunde oder Minute. Das ist praktisch, wenn du zum Beispiel Bestellungen pro Jahr zählen oder den Wochentag bestimmen willst.
Syntax:
DATE_PART('teil', datum)
Beispiel:
SELECT DATE_PART('year', NOW()) AS current_year;
Beispiel-Ergebnis:
| current_year |
|---|
| 2025 |
Datumsteile, die du extrahieren kannst:
year: Jahr.month: Monat.day: Tag.hour: Stunde.minute: Minute.second: Sekunde.dow: Wochentag (0 = Sonntag).
Beispiel 2: Den Monat aus dem aktuellen Datum holen.
SELECT DATE_PART('month', CURRENT_DATE) AS current_month;
Ergebnis:
| current_month |
|---|
| 6 |
Du kannst DATE_PART() auch für komplexere Sachen nutzen. Zum Beispiel:
Du willst nur die User auswählen, die im aktuellen Jahr geboren wurden:
SELECT *
FROM students
WHERE DATE_PART('year', birth_date) = DATE_PART('year', CURRENT_DATE);
Beispiel-Ergebnis:
| id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 1 | Otto | Art | 2025-03-12 | 9 |
| 2 | Anna | Pal | 2025-07-08 | 8 |
| 3 | Piu | Wolf | 2025-01-22 | 10 |
| 4 | Eva | Go | 2025-09-30 | 7 |
| 5 | Dan | Sok | 2025-06-14 | 9 |
Praktische Beispiele
In manchen Beispielen tauchen Operatoren auf, die du noch nicht kennst. Kein Stress, bald wirst du solche Sachen locker meistern. Ich will dir einfach ein paar echte Beispiele aus dem Alltag zeigen. Und dich ein bisschen neugierig machen :)
Beispiel 1: Das Alter eines Users bestimmen
Angenommen, wir haben eine Tabelle users mit dem Geburtsdatum jedes Users. Wir wollen ihr Alter berechnen.
Abfrage:
SELECT user_id, first_name, last_name,
DATE_PART('year', CURRENT_DATE) - DATE_PART('year', birth_date) AS age
FROM users;
Wir ziehen einfach das Geburtsjahr vom aktuellen Jahr ab. Das ist schnell, aber nicht ganz exakt.
Beispiel-Ergebnis:
| user_id | first_name | last_name | age |
|---|---|---|---|
| 101 | Alex | Lin | 25 |
| 102 | Maria | Chi | 30 |
| 103 | Tor | Coz | 22 |
| 104 | Nat | Ive | 27 |
| 105 | Don | Sok | 35 |
Beispiel 2: Nach Zeit filtern
Wenn du alle Bestellungen aus der letzten Stunde holen willst:
SELECT *
FROM orders
WHERE order_date >= NOW() - INTERVAL '1 hour';
Siehst du, wie praktisch INTERVAL (Zeitintervall) ist?
Beispiel 3: Nach Monaten gruppieren
Du willst die Anzahl der Bestellungen pro Monat im aktuellen Jahr zählen:
SELECT DATE_PART('month', order_date) AS order_month, COUNT(*) AS order_count
FROM orders
WHERE DATE_PART('year', order_date) = DATE_PART('year', CURRENT_DATE)
GROUP BY DATE_PART('month', order_date)
ORDER BY order_month;
Die Gruppierung läuft über die Monatsnummer, und das Ergebnis wird danach sortiert.
Beispiel-Ergebnis:
| order_month | order_count |
|---|---|
| 1 | 120 |
| 2 | 95 |
| 3 | 134 |
| 4 | 110 |
| 5 | 42 |
Beispiel 4: Den Wochentag extrahieren
Du willst wissen, an welchem Wochentag die meisten Bestellungen gemacht wurden:
SELECT DATE_PART('dow', order_date) AS day_of_week, COUNT(*) AS order_count
FROM orders
GROUP BY DATE_PART('dow', order_date)
ORDER BY order_count DESC;
Der Befehl DATE_PART('dow') gibt dir den Wochentag jeder Bestellung als Zahl zurück, wobei 0 = Sonntag, 1 = Montag usw. DOW steht für DayOfWeek – also Wochentag.
Beispiel-Ergebnis:
| day_of_week | order_count |
|---|---|
| 5 | 210 |
| 4 | 190 |
| 3 | 175 |
| 2 | 160 |
| 1 | 140 |
| 6 | 120 |
| 0 | 95 |
Achte auf typische Fehler
Mit Daten zu arbeiten kann manchmal Kopfschmerzen machen, weil Fehler passieren. Hier ein paar typische Probleme, auf die du stoßen könntest:
Format von Zeit und Datum: Wenn du NOW() oder eine andere Funktion nutzt, die Datum mit Uhrzeit zurückgibt, check immer das Format. Zum Beispiel: Wenn du order_date mit CURRENT_DATE vergleichst, achte darauf, dass die Uhrzeit ignoriert wird oder explizit angegeben ist.
Datum als String: Oft werden Datenbanken so gebaut, dass Daten als Strings (also Text) gespeichert werden. Wenn du dann Datumsfunktionen wie DATE_PART() benutzt, gibt’s einen Fehler. Stell sicher, dass deine Daten den Typ DATE oder TIMESTAMP haben.
Unterschiedliche Zeitzonen: Wenn dein Server in einer anderen Zeitzone läuft als die Datenquelle, kann das zu Verwirrung führen. Überleg dir, ob du TIMESTAMPTZ (Timestamp mit Zeitzone) nutzen willst.
GO TO FULL VERSION