In der Welt der SQL-Datenbanken ist PostgreSQL für seine Robustheit und seinen großen Funktionsumfang bekannt. Eine dieser Funktionen ist die starke Unterstützung für Datums- und Zeitstempeltypen. In diesem Leitfaden schauen wir uns an, wie du Datumswerte in PostgreSQL formatierst – inklusive Codebeispielen. Dieses Tutorial richtet sich an Softwareentwickler und andere technisch Interessierte, die ihr PostgreSQL-Wissen erweitern möchten.
Datumswerte in PostgreSQL verstehen
Bevor wir uns mit dem Formatieren beschäftigen, ist es wichtig zu verstehen, wie Datumswerte in PostgreSQL dargestellt werden. PostgreSQL verwendet den Datentyp „Date“, um Datumswerte zu speichern. So erstellst du eine Tabelle mit einer DATE-Spalte.
CREATE TABLE orders (
order_id serial PRIMARY KEY,
order_date DATE NOT NULL
);
Jetzt fügen wir ein paar Daten in die Tabelle orders ein.
INSERT INTO orders (order_date) VALUES
('2022-04-01'),
('2022-04-02'),
('2022-04-03');
PostgreSQL ist clever und erkennt ein Datum in einem String, wenn du es im ISO-6801-Format angibst.
Datumswerte in PostgreSQL formatieren: Die Funktion TO_CHAR
Die wichtigste Methode zum Formatieren von Datumswerten in PostgreSQL ist die Funktion TO_CHAR. Mit TO_CHAR kannst du Datums- und Zeittypen in einen String mit einem bestimmten Muster umwandeln. So wird sie verwendet:
TO_CHAR(date, format)
Die vollständige Liste der Formatierungsoptionen findest du in der PostgreSQL-Dokumentation. Hier sind die Formatierungsoptionen mit Stand Januar 2024:
| Muster | Beschreibung |
|---|---|
| HH | Stunde des Tages (01–12) |
| HH12 | Stunde des Tages (01–12) |
| HH24 | Stunde des Tages (00–23) |
| MI | Minute (00–59) |
| SS | Sekunde (00–59) |
| MS | Millisekunde (000–999) |
| US | Mikrosekunde (000000–999999) |
| FF1 | Zehntelsekunde (0–9) |
| FF2 | Hundertstelsekunde (00–99) |
| FF3 | Millisekunde (000–999) |
| FF4 | Zehntel einer Millisekunde (0000–9999) |
| FF5 | Hundertstel einer Millisekunde (00000–99999) |
| FF6 | Mikrosekunde (000000–999999) |
| SSSS, SSSSS | Sekunden seit Mitternacht (0–86399) |
| AM, am, PM oder pm | Vormittags-/Nachmittagsangabe (ohne Punkte) |
| A.M., a.m., P.M. oder p.m. | Vormittags-/Nachmittagsangabe (mit Punkten) |
| Y,YYY | Jahr (4 oder mehr Ziffern) mit Komma |
| YYYY | Jahr (4 oder mehr Ziffern) |
| YYY | letzte 3 Ziffern des Jahres |
| YY | letzte 2 Ziffern des Jahres |
| Y | letzte Ziffer des Jahres |
| IYYY | Kalenderwochenjahr nach ISO 8601 (4 oder mehr Ziffern) |
| IYY | letzte 3 Ziffern des Kalenderwochenjahres nach ISO 8601 |
| IY | letzte 2 Ziffern des Kalenderwochenjahres nach ISO 8601 |
| I | letzte Ziffer des Kalenderwochenjahres nach ISO 8601 |
| BC, bc, AD oder ad | Epochenangabe (ohne Punkte) |
| B.C., b.c., A.D. oder a.d. | Epochenangabe (mit Punkten) |
| MONTH | vollständiger Monatsname in Großbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| Month | vollständiger Monatsname mit großem Anfangsbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| month | vollständiger Monatsname in Kleinbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| MON | abgekürzter Monatsname in Großbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| Mon | abgekürzter Monatsname mit großem Anfangsbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| mon | abgekürzter Monatsname in Kleinbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| MM | Monatsnummer (01–12) |
| DAY | vollständiger Wochentagsname in Großbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| Day | vollständiger Wochentagsname mit großem Anfangsbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| day | vollständiger Wochentagsname in Kleinbuchstaben (mit Leerzeichen auf 9 Zeichen aufgefüllt) |
| DY | abgekürzter Wochentagsname in Großbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| Dy | abgekürzter Wochentagsname mit großem Anfangsbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| dy | abgekürzter Wochentagsname in Kleinbuchstaben (3 Zeichen auf Englisch, lokalisiert unterschiedlich lang) |
| DDD | Tag des Jahres (001–366) |
| IDDD | Tag des Kalenderwochenjahres nach ISO 8601 (001–371; Tag 1 des Jahres ist der Montag der ersten ISO-Woche) |
| DD | Tag des Monats (01–31) |
| D | Wochentag, Sonntag (1) bis Samstag (7) |
| ID | Wochentag nach ISO 8601, Montag (1) bis Sonntag (7) |
| W | Woche des Monats (1–5) (die erste Woche beginnt am ersten Tag des Monats) |
| WW | Wochennummer des Jahres (1–53) (die erste Woche beginnt am ersten Tag des Jahres) |
| IW | Wochennummer des Kalenderwochenjahres nach ISO 8601 (01–53; der erste Donnerstag des Jahres liegt in Woche 1) |
| CC | Jahrhundert (2 Ziffern) (das einundzwanzigste Jahrhundert beginnt am 2001-01-01) |
| J | Julianisches Datum (ganze Tage seit dem 24. November 4714 v. Chr. um Mitternacht Ortszeit; siehe Abschnitt B.7) |
| Q | Quartal |
| RM | Monat in römischen Ziffern, Großbuchstaben (I–XII; I=Januar) |
| rm | Monat in römischen Ziffern, Kleinbuchstaben (i–xii; i=Januar) |
| TZ | Zeitzonenabkürzung in Großbuchstaben (nur in to_char unterstützt) |
| tz | Zeitzonenabkürzung in Kleinbuchstaben (nur in to_char unterstützt) |
| TZH | Zeitzonen-Stunden |
| TZM | Zeitzonen-Minuten |
| OF | Zeitzonenversatz zu UTC (nur in to_char unterstützt) |
Beispiele zur Datumsformatierung
Wandeln wir unser Datum zunächst in einen einfachen, gut lesbaren String um. So geht’s:
SELECT order_id, TO_CHAR(order_date, 'DD Mon YYYY') as formatted_date
FROM orders;
Die Ausgabe sieht dann so aus:
order_id | formatted_date
———+—————-
1 | 13 Jan 2024
2 | 12 Jan 2024
3 | 11 Jan 2024
4 | 10 Jan 2024
5 | 09 Jan 2024
Wir können auch nur einen Teil des Datums extrahieren:
SELECT order_id, TO_CHAR(order_date, 'Day') as day_of_week
FROM orders;
order_id | day_of_week
———+————-
1 | Friday
2 | Thursday
3 | Wednesday
4 | Tuesday
5 | Monday
Wenn wir wollen, können wir Formate sogar kombinieren:
SELECT order_id, TO_CHAR(order_date, 'Day, DD Mon YYYY') as detailed_date
FROM orders;
order_id | detailed_date
———+————————
1 | Friday, 13 Jan 2024
2 | Thursday, 12 Jan 2024
3 | Wednesday, 11 Jan 2024
4 | Tuesday, 10 Jan 2024
5 | Monday, 09 Jan 2024
Die Funktion EXTRACT
Die Funktion EXTRACT bietet einfachen Zugriff auf alle möglichen Bestandteile eines Datums-/Zeitwerts, etwa Jahr, Monat, Tag usw.
SELECT order_id, EXTRACT(MONTH from order_date) as order_month
FROM orders;
order_id | order_month
———+————
1 | 1
2 | 1
3 | 1
4 | 1
5 | 1
Das sind die Grundlagen der Datumsformatierung in PostgreSQL. Mit diesen Werkzeugen hast du eine solide Basis für den Umgang mit Datumswerten. Wie bei allem in der Programmierung gilt: Übung macht den Meister. Probier die Befehle selbst aus und schau, was dir noch einfällt. Happy Coding!
Du solltest diese Abfragen unbedingt mal in Beekeeper Studio ausführen. :-)
Beekeeper Studio ist eine kostenlose & quelloffene Datenbank-GUI
Das beste SQL-Abfrage- & Editor-Tool, das ich je benutzt habe. Es bietet alles, was ich zum Verwalten meiner Datenbank brauche. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio ist schnell, intuitiv und einfach zu bedienen. Beekeeper unterstützt jede Menge Datenbanken und läuft hervorragend auf Windows, Mac und Linux.
Was Nutzer über Beekeeper Studio sagen
„Beekeeper Studio hat meinen alten SQL-Workflow komplett ersetzt. Es ist schnell, intuitiv und macht die Arbeit mit Datenbanken wieder zum Vergnügen.“
„Ich habe viele Datenbank-GUIs ausprobiert, aber Beekeeper findet die perfekte Balance zwischen Funktionsumfang und Einfachheit. Es funktioniert einfach.“