CodeGym /Kurse /SQL SELF /Datumsformat-Umwandlung

Datumsformat-Umwandlung

SQL SELF
Level 31 , Lektion 3
Verfügbar

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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION