Die Welt der Datenbanken und des Frontends ist sich oft nicht einig, wie ein Datum eigentlich aussehen soll. PostgreSQL kann Daten als DATE, TIMESTAMP oder sogar TIMESTAMPTZ speichern, aber dieses Format ist nicht immer optimal für die Anzeige beim User. Zum Beispiel wollen Designer statt dem Standard-Format 2023-10-01 12:30:45 vielleicht lieber 01 Oktober 2023 Jahr, 12:30 sehen. Und manchmal muss das Datum für Reports oder ein API formatiert werden.
Um Daten in einen String zu verwandeln und zurück, gibt’s in PostgreSQL die Funktionen TO_CHAR() und TO_DATE().
Funktion TO_CHAR()
TO_CHAR() ist dein bester Kumpel, wenn du aus Zeitdaten ein menschenlesbares String-Format machen willst. Die Funktion nimmt ein Datum oder einen Zeitstempel und formatiert ihn nach deinem Wunsch-Format.
Syntax
TO_CHAR(value, format)
value— das Datum oder der Zeitstempel, den du umwandeln willst.format— ein String mit dem Format-Template, wie du das Datum anzeigen willst.
Format-Beispiele
| Format-Template | Bedeutung | Beispiel |
|---|---|---|
YYYY |
Jahr | 2023 |
MM |
Monat (Zahl von 01 bis 12) | 10 |
MONTH |
Monatsname (in Großbuchstaben) | OCTOBER |
DAY |
Wochentag (in Großbuchstaben) | SUNDAY |
DD |
Tag im Monat | 01 |
HH24 |
Stunden im 24h-Format | 15 |
MI |
Minuten | 45 |
SS |
Sekunden | 30 |
Die komplette Liste der Formate findest du in der offiziellen PostgreSQL-Doku.
Beispiele für TO_CHAR()
Datum für einen Report formatieren
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- Ergebnis: '09.10.2023'
Zeit im 12h-Format anzeigen
SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- Ergebnis: '03:45 PM'
Monat als Wort ausgeben
SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- Ergebnis: 'October '
Achtung: PostgreSQL hängt am Ende ein Leerzeichen an. Das ist ein Feature, kein Bug! Um die Leerzeichen loszuwerden, nutze TRIM():
SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;
Eigenes Format bauen
SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- Ergebnis: '2023/10/09 15:45:30'
Formatierung für User Interface
SELECT TO_CHAR(NOW(), 'DD "Oktober" YYYY Jahr') AS user_friendly_date;
-- Ergebnis: '09 Oktober 2023 Jahr'
Funktion TO_DATE()
TO_DATE() macht das Gegenteil: Sie nimmt einen String und wandelt ihn in den Datentyp DATE um. Wozu das Ganze? Zum Beispiel kann ein User ein Datum im Format 01-10-2023 eingeben, und PostgreSQL muss "verstehen", was das für ein Datum ist.
Syntax
TO_DATE(value, format)
value— der String, der das Datum enthält.format— ein String mit dem Template, das das Format des Strings beschreibt.<
Beispiele für TO_DATE()
String zu Datum umwandeln
SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- Ergebnis: '2023-10-01' (Datentyp: DATE)
String-Datum mit Datum in Tabelle vergleichen
Angenommen, wir haben eine Tabelle appointments mit einer Spalte appointment_date vom Typ DATE. Der User gibt das Datum als String ein:
SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');
Falsches Format
Wichtig: Wenn das String-Format nicht zum Template passt, gibt’s einen Fehler! Zum Beispiel:
SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- Fehler: ungültiges Eingabeformat
Userdaten prüfen
Angenommen, wir bauen eine Tabelle für Bestellungen, wo das Datum vom User eingegeben wird:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE
);
-- Daten einfügen und String zu Datum umwandeln
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));
Praktische Beispiele
Report-Formatierung. In der Tabelle sales wird das Verkaufsdatum in der Spalte sale_date (Typ TIMESTAMP) gespeichert. Es soll ein Report ausgegeben werden, bei dem die Daten im Format DD.MM.YYYY angezeigt werden.
-- Beispieldaten
CREATE TABLE sales (
sale_id SERIAL PRIMARY KEY,
sale_date TIMESTAMP
);
INSERT INTO sales (sale_date)
VALUES
('2023-10-01 15:30:00'),
('2023-10-02 10:15:00'),
('2023-10-03 12:45:00');
-- Report
SELECT sale_id,
TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;
Userdaten umwandeln. Angenommen, der User gibt das Datum als String im Format MM/DD/YYYY ein. Das muss in DATE umgewandelt werden, um es im System zu speichern.
INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));
Typische Fehler und Tipps
Falsches Format. Ein häufiger Fehler ist, wenn das String-Format nicht zum Template passt. Zum Beispiel: Der User gibt das Datum als 01-10-2023 ein, aber das Template ist MM/DD/YYYY – dann gibt PostgreSQL einen Fehler aus. Tipp: Immer User-Input validieren, bevor du ihn an SQL weitergibst.
Leerzeichen in TO_CHAR()-Formaten. Manche Formate wie MONTH hängen Leerzeichen an. Wenn das stört, nutze TRIM().
Fehler beim Parsen von Strings. Wenn der String unerwartete Zeichen oder ein falsches Format enthält, kann PostgreSQL ihn nicht umwandeln. Tipp: Nutze Regex oder zusätzliche Checks, bevor du Daten in die DB schreibst.
Falsche Verwendung von Zeitformaten. Zum Beispiel, wenn du versuchst, einen TIMESTAMP mit einem Template für DATE zu verarbeiten. Tipp: Achte darauf, dass die Datentypen zu deinem Use Case passen.
Die Funktionen TO_CHAR() und TO_DATE() geben dir mega viele Möglichkeiten, mit Zeitdaten zu arbeiten. Du kannst coole Formate für Reports bauen, User-Input umwandeln und deine SQL-Queries viel lesbarer machen. Im echten Leben werden diese Funktionen oft für Datenvisualisierung, Reporting, Integration mit anderen Systemen und für User Interfaces genutzt.
GO TO FULL VERSION