Oracle SQL: Datumswerte und Zahlen mit TO_CHAR richtig formatieren

Datumswerte und Zahlen werden in Oracle intern nicht in jener Schreibweise gespeichert, die später in Berichten, Exportdateien oder Benutzeroberflächen angezeigt wird. Ein DATE bleibt ein Datumswert und ein NUMBER bleibt eine Zahl. Erst bei der Ausgabe werden diese Werte mit TO_CHAR in formatierten Text umgewandelt.

Dabei entstehen häufig unerwartete Leerzeichen, fehlende führende Nullen, falsche Dezimaltrennzeichen oder englische Monatsnamen. Besonders wichtig sind deshalb die Formatmodifikatoren FM, MI und FX sowie die NLS-Parameter für Sprache und Zahlenformat.

Dieser Beitrag zeigt anhand ausführbarer Oracle-SQL-Beispiele, wie Datumswerte, Zeitstempel und Zahlen kontrolliert formatiert werden.

Wichtig: Die Beispiele gelten für Oracle SQL

Die Funktionen und Formatmodelle in diesem Beitrag gehören zu Oracle Database. Andere Datenbanksysteme verwenden teilweise andere Funktionen:

DatenbanksystemTypische Formatierungsfunktion
Oracle DatabaseTO_CHAR
PostgreSQLTO_CHAR
Microsoft SQL ServerFORMAT oder CONVERT
MySQLDATE_FORMAT und FORMAT
SQLitestrftime und printf

Obwohl PostgreSQL ebenfalls TO_CHAR unterstützt, sind nicht alle Oracle-Formatmodelle und NLS-Einstellungen übertragbar.

Was macht TO_CHAR in Oracle?

TO_CHAR wandelt einen Datums-, Zeitstempel- oder Zahlenwert in einen Textwert vom Typ VARCHAR2 um.

Grundsyntax für Datumswerte:

TO_CHAR(datumswert, 'formatmodell')

Grundsyntax für Zahlen:

TO_CHAR(zahl, 'formatmodell')

Optional kann ein dritter Parameter verwendet werden, um Sprache, Dezimalzeichen, Gruppierungszeichen oder Währung unabhängig von den Session-Einstellungen festzulegen.

TO_CHAR(wert, 'formatmodell', 'nls_parameter')

Das Formatmodell verändert nicht den gespeicherten Datenbankwert. Es steuert ausschließlich, wie Oracle den Wert als Text zurückgibt.

Die wichtigsten Datumsformate im Überblick

FormatBedeutungBeispiel
DDTag des Monats01
MMMonat als Zahl05
MONAbgekürzter MonatsnameMAI
MONTHVollständiger MonatsnameMAI
YYYYVierstellige Jahreszahl2026
YYZweistellige Jahreszahl26
DYAbgekürzter WochentagFR
DAYVollständiger WochentagFREITAG
HH24Stunde von 00 bis 2314
MIMinute05
SSSekunde09
FF3Millisekunden123
TZH:TZMZeitzonenverschiebung+02:00

Oracle empfiehlt grundsätzlich die vierstellige Jahresangabe YYYY, weil kürzere Jahresangaben mehrdeutig sein können.

Datumswerte mit TO_CHAR formatieren

Für reproduzierbare Beispiele sollte statt SYSDATE möglichst ein festes Datum verwendet werden.

SELECT TO_CHAR(
           DATE '2026-07-30',
           'DD.MM.YYYY'
       ) AS formatiertes_datum
FROM dual;

Ergebnis:

30.07.2026

Ein Datumswert mit Uhrzeit kann so ausgegeben werden:

SELECT TO_CHAR(
           TO_DATE(
               '30.07.2026 14:05:09',
               'DD.MM.YYYY HH24:MI:SS'
           ),
           'DD.MM.YYYY HH24:MI:SS'
       ) AS datum_und_uhrzeit
FROM dual;

Ergebnis:

30.07.2026 14:05:09

Bei Oracle enthält der Datentyp DATE neben Jahr, Monat und Tag auch Stunde, Minute und Sekunde. Bruchteile einer Sekunde oder eine Zeitzone werden dagegen erst durch entsprechende TIMESTAMP-Datentypen unterstützt.

Warum Oracle Monatsnamen mit Leerzeichen auffüllt

Die Formate MONTH, MON, DAY und DY werden standardmäßig auf eine einheitliche Länge aufgefüllt. Dadurch beginnen nachfolgende Spaltenbestandteile immer an derselben Position.

SELECT TO_CHAR(
           DATE '2026-05-01',
           'MONTH YYYY',
           'NLS_DATE_LANGUAGE=GERMAN'
       ) AS monat
FROM dual;

Das Ergebnis enthält zwischen MAI und 2026 mehrere unsichtbare Leerzeichen:

MAI      2026

Wie viele Leerzeichen ergänzt werden, hängt von der Länge des längsten Monatsnamens in der verwendeten Sprache ab. Bei deutscher Sprache wird MAI auf die Länge von SEPTEMBER erweitert.

Das lässt sich mit LENGTH sichtbar machen:

SELECT
    LENGTH(
        TO_CHAR(
            DATE '2026-05-01',
            'MONTH',
            'NLS_DATE_LANGUAGE=GERMAN'
        )
    ) AS laenge_mit_padding,

    LENGTH(
        TO_CHAR(
            DATE '2026-05-01',
            'FMMONTH',
            'NLS_DATE_LANGUAGE=GERMAN'
        )
    ) AS laenge_ohne_padding
FROM dual;

Ergebnis:

LAENGE_MIT_PADDING    9
LAENGE_OHNE_PADDING   3

Leerzeichen mit FM entfernen

FM steht für Fill Mode. Der Modifikator unterdrückt die automatische Auffüllung mit Leerzeichen und bei numerischen Datumselementen auch führende Nullen.

SELECT TO_CHAR(
           DATE '2026-05-01',
           'FMMONTH YYYY',
           'NLS_DATE_LANGUAGE=GERMAN'
       ) AS monat
FROM dual;

Ergebnis:

MAI 2026

Das ist besonders für folgende Anwendungsfälle relevant:

  • Dropdown-Listen
  • CSV-Exporte
  • Berichtsspalten
  • dynamische Texte
  • Gruppierungsbezeichnungen
  • JSON- oder XML-Ausgaben
  • Dateinamen

Oracle beschreibt FM als Formatmodifikator, der führende und nachfolgende Auffüllzeichen unterdrückt. Der Modifikator wirkt ab seiner Position im Formatmodell und kann bei mehrfacher Verwendung ein- und ausgeschaltet werden.

Achtung: FM entfernt auch führende Nullen

FM entfernt nicht nur Leerzeichen bei Monatsnamen. Es unterdrückt auch führende Nullen bei numerischen Datumsbestandteilen.

SELECT
    TO_CHAR(
        DATE '2026-05-01',
        'DD.MM.YYYY'
    ) AS mit_nullen,

    TO_CHAR(
        DATE '2026-05-01',
        'FMDD.MM.YYYY'
    ) AS ohne_nullen
FROM dual;

Ergebnis:

MIT_NULLEN     01.05.2026
OHNE_NULLEN    1.5.2026

Soll der Tag zweistellig bleiben, während nur die Leerzeichen hinter dem Monatsnamen verschwinden, können zwei Ausgaben kombiniert werden:

SELECT
    TO_CHAR(
        DATE '2026-05-01',
        'DD. '
    )
    ||
    TO_CHAR(
        DATE '2026-05-01',
        'FMMonth YYYY',
        'NLS_DATE_LANGUAGE=GERMAN'
    ) AS datum
FROM dual;

Ergebnis:

01. Mai 2026

Deutsche Monats- und Wochentagsnamen erzwingen

Monats- und Wochentagsnamen hängen normalerweise von der Spracheinstellung der aktuellen Oracle-Session ab. Dadurch kann dieselbe Abfrage auf verschiedenen Systemen unterschiedliche Ergebnisse liefern.

Eine stabile deutsche Ausgabe entsteht durch den dritten Parameter von TO_CHAR:

SELECT TO_CHAR(
           DATE '2026-07-30',
           'FMDay, DD. Month YYYY',
           'NLS_DATE_LANGUAGE=GERMAN'
       ) AS datum
FROM dual;

Ergebnis:

Donnerstag, 30. Juli 2026

Für eine englische Ausgabe wird entsprechend ENGLISH verwendet:

SELECT TO_CHAR(
           DATE '2026-07-30',
           'FMDay, DD Month YYYY',
           'NLS_DATE_LANGUAGE=ENGLISH'
       ) AS datum
FROM dual;

Ergebnis:

Thursday, 30 July 2026

Die Groß- und Kleinschreibung des ausgegebenen Monats- oder Wochentagsnamens richtet sich nach der Schreibweise im Formatmodell:

SELECT
    TO_CHAR(
        DATE '2026-07-30',
        'DAY',
        'NLS_DATE_LANGUAGE=GERMAN'
    ) AS gross,

    TO_CHAR(
        DATE '2026-07-30',
        'Day',
        'NLS_DATE_LANGUAGE=GERMAN'
    ) AS gemischt,

    TO_CHAR(
        DATE '2026-07-30',
        'day',
        'NLS_DATE_LANGUAGE=GERMAN'
    ) AS klein
FROM dual;

Typische Ausgabe:

DONNERSTAG
Donnerstag
donnerstag

Die Sprache kann direkt innerhalb des Funktionsaufrufs festgelegt werden und muss daher nicht global mit ALTER SESSION verändert werden.

TIMESTAMP mit Millisekunden formatieren

Der Datentyp DATE unterstützt keine Sekundenbruchteile. Dafür wird TIMESTAMP verwendet.

SELECT TO_CHAR(
           TIMESTAMP '2026-07-30 14:05:09.123456',
           'DD.MM.YYYY HH24:MI:SS.FF3'
       ) AS zeitstempel
FROM dual;

Ergebnis:

30.07.2026 14:05:09.123

FF3 gibt drei Stellen der Sekundenbruchteile aus. Möglich sind Werte von FF1 bis FF9, sofern die Genauigkeit des verwendeten Datentyps dies unterstützt.

Ein Zeitstempel mit Zeitzonenverschiebung kann so dargestellt werden:

SELECT TO_CHAR(
           SYSTIMESTAMP,
           'DD.MM.YYYY HH24:MI:SS.FF3 TZH:TZM'
       ) AS zeitstempel
FROM dual;

SYSTIMESTAMP liefert die Systemzeit des Datenbankservers einschließlich Sekundenbruchteilen und Zeitzone.

Die wichtigsten Zahlenformate

FormatBedeutung
9Optionale Ziffer; nicht benötigte Stellen werden zu Leerzeichen
0Erzwungene Ziffer beziehungsweise führende oder nachfolgende Null
DDezimaltrennzeichen gemäß NLS-Einstellung
GGruppierungszeichen gemäß NLS-Einstellung
FMEntfernt führende und nachfolgende Auffüllzeichen
MIMinuszeichen hinter der Zahl
SExplizites Plus- oder Minuszeichen
PRNegative Zahl in spitzen Klammern
LLokales Währungssymbol
CInternationales Währungssymbol

Der Unterschied zwischen 9 und 0

9 reserviert eine mögliche Ziffernposition. Nicht benötigte führende Stellen werden als Leerzeichen ausgegeben.

0 erzwingt dagegen eine Ziffer und ergänzt bei Bedarf eine Null.

SELECT
    TO_CHAR(7, 'FM999') AS ohne_nullen,
    TO_CHAR(7, 'FM000') AS mit_nullen
FROM dual;

Ergebnis:

OHNE_NULLEN    7
MIT_NULLEN     007

Für normale Zahlenanzeigen wird meist 9 verwendet. 0 ist sinnvoll, wenn eine feste Stellenanzahl benötigt wird, beispielsweise bei Nummernkreisen oder technischen Exportformaten.

Führende Leerzeichen bei Zahlen entfernen

Oracle reserviert bei normalen Zahlenformaten standardmäßig Platz für ein mögliches Vorzeichen. Positive Zahlen können deshalb mit einem führenden Leerzeichen ausgegeben werden.

SELECT
    '[' || TO_CHAR(123, '999') || ']' AS ohne_fm,
    '[' || TO_CHAR(123, 'FM999') || ']' AS mit_fm
FROM dual;

Ergebnis:

OHNE_FM    [ 123]
MIT_FM     [123]

Die eckigen Klammern machen das sonst kaum sichtbare Leerzeichen erkennbar.

Deutsche Dezimal- und Tausendertrennzeichen verwenden

Für eine deutsche Zahlenformatierung sollte nicht direkt mit Punkten und Kommas im Formatmodell gearbeitet werden. Besser sind die NLS-abhängigen Elemente:

  • D für das Dezimaltrennzeichen
  • G für das Gruppierungszeichen
SELECT TO_CHAR(
           1234567.89,
           'FM999G999G990D00',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Ergebnis:

1.234.567,89

Bei NLS_NUMERIC_CHARACTERS=',.' steht das erste Zeichen für das Dezimalzeichen und das zweite für das Gruppierungszeichen.

Für eine englische Darstellung werden die Zeichen umgekehrt:

SELECT TO_CHAR(
           1234567.89,
           'FM999G999G990D00',
           'NLS_NUMERIC_CHARACTERS=''.,'''
       ) AS amount
FROM dual;

Ergebnis:

1,234,567.89

Die explizite Angabe des NLS-Parameters verhindert, dass das Ergebnis von der Session-Konfiguration des jeweiligen Benutzers oder Servers abhängt.

Geldbeträge in Euro formatieren

Für eine stabile deutschsprachige Darstellung kann das Eurozeichen als Text angehängt werden:

SELECT
    TO_CHAR(
        1234.5,
        'FM999G999G990D00',
        'NLS_NUMERIC_CHARACTERS='',.'''
    ) || ' €' AS betrag
FROM dual;

Ergebnis:

1.234,50 €

Das Format besitzt genügend Stellen für größere Werte und erzwingt zwei Nachkommastellen.

Wird ein zu kleines Formatmodell verwendet, ersetzt Oracle den Wert durch Rauten:

SELECT TO_CHAR(
           1234567.89,
           'FM999D00',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Mögliches Ergebnis:

########

Die Formatmaske muss daher auf den größten erwarteten Wert abgestimmt werden. Oracle rundet Zahlen auf die im Formatmodell vorgesehene Genauigkeit. Reichen die Vorkommastellen nicht aus, wird der Wert durch #-Zeichen ersetzt.

Negative Zahlen formatieren

Standarddarstellung

Ohne speziellen Vorzeichenparameter steht das Minuszeichen vor der Zahl:

SELECT TO_CHAR(
           -1234.5,
           'FM999G990D00',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Ergebnis:

-1.234,50

Minuszeichen hinter der Zahl mit MI

MI setzt das Minuszeichen hinter die Zahl:

SELECT TO_CHAR(
           -1234.5,
           'FM999G990D00MI',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Ergebnis:

1.234,50-

Bei einer positiven Zahl erzeugt MI normalerweise ein nachfolgendes Leerzeichen. Durch FM wird dieses Leerzeichen entfernt.

MI darf nur an der letzten Position des Zahlenformatmodells stehen.

Plus- und Minuszeichen mit S

S gibt sowohl bei positiven als auch bei negativen Zahlen ein Vorzeichen aus:

SELECT
    TO_CHAR(125,  'FMS999') AS positiv,
    TO_CHAR(-125, 'FMS999') AS negativ
FROM dual;

Ergebnis:

POSITIV    +125
NEGATIV    -125

S darf am Anfang oder am Ende des Formatmodells stehen.

Negative Zahlen in Klammern mit PR

PR stellt negative Werte in spitzen Klammern dar:

SELECT TO_CHAR(
           -1234.5,
           'FM999G990D00PR',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Ergebnis:

<1.234,50>

Diese Darstellung wird teilweise in Buchhaltungs- und Berichtssystemen verwendet.

Text wieder in Datum oder Zahl umwandeln

TO_CHAR konvertiert einen Wert in Text. Für die umgekehrte Richtung werden TO_DATE, TO_TIMESTAMP oder TO_NUMBER verwendet.

Text in ein Datum umwandeln

SELECT TO_DATE(
           '30.07.2026',
           'DD.MM.YYYY'
       ) AS datum
FROM dual;

Text in einen Zeitstempel umwandeln

SELECT TO_TIMESTAMP(
           '30.07.2026 14:05:09.123',
           'DD.MM.YYYY HH24:MI:SS.FF3'
       ) AS zeitstempel
FROM dual;

Deutschen Zahlentext in NUMBER umwandeln

SELECT TO_NUMBER(
           '1.234,50',
           '999G999D00',
           'NLS_NUMERIC_CHARACTERS='',.'''
       ) AS betrag
FROM dual;

Das Ergebnis ist wieder ein echter Zahlenwert und kein Text.

Eingaben mit FX streng prüfen

Oracle kann bei Datumsumwandlungen teilweise toleranter sein, als es für Imports oder Schnittstellen gewünscht ist. FX steht für Format Exact und verlangt eine genaue Übereinstimmung zwischen Eingabetext und Formatmodell.

SELECT TO_DATE(
           '30.07.2026',
           'FXDD.MM.YYYY'
       ) AS datum
FROM dual;

Mit FX müssen Trennzeichen, Reihenfolge und Stellenanzahl dem angegebenen Format entsprechen. Der Modifikator eignet sich daher für kontrollierte Dateiimporte und Schnittstellenvalidierungen.

Häufige Fehler bei der Formatierung

1. Implizite Datumsumwandlungen verwenden

Problematisch:

WHERE rechnungsdatum = '30.07.2026'

Oracle muss den Text abhängig von der aktuellen NLS_DATE_FORMAT-Einstellung implizit in ein Datum umwandeln. Die Abfrage kann deshalb in einer Session funktionieren und in einer anderen einen Fehler liefern.

Besser:

WHERE rechnungsdatum = DATE '2026-07-30'

Oder bei einem Datum mit möglichem Zeitanteil:

WHERE rechnungsdatum >= DATE '2026-07-30'
  AND rechnungsdatum <  DATE '2026-07-31'

Das ANSI-Datumsliteral besitzt immer das Format YYYY-MM-DD und ist nicht von der Spracheinstellung der Session abhängig.

2. Formatierte Datumswerte sortieren

Problematisch:

SELECT TO_CHAR(rechnungsdatum, 'DD.MM.YYYY') AS datum
FROM rechnungen
ORDER BY TO_CHAR(rechnungsdatum, 'DD.MM.YYYY');

Hier wird alphabetisch nach Text sortiert. Dadurch kann beispielsweise der 31. Januar vor dem 2. Februar erscheinen.

Besser:

SELECT TO_CHAR(rechnungsdatum, 'DD.MM.YYYY') AS datum
FROM rechnungen
ORDER BY rechnungsdatum;

Die Anzeige wird formatiert, die Sortierung erfolgt aber weiterhin mit dem echten Datumswert.

3. Nach formatierten Monatsnamen gruppieren

Problematisch:

SELECT
    TO_CHAR(rechnungsdatum, 'MONTH') AS monat,
    SUM(nettobetrag)
FROM rechnungen
GROUP BY TO_CHAR(rechnungsdatum, 'MONTH');

Dabei entstehen mehrere Schwierigkeiten:

  • Monatsnamen enthalten möglicherweise Leerzeichen.
  • Die Sprache hängt von der Session ab.
  • Gleiche Monate unterschiedlicher Jahre werden zusammengefasst.
  • Die chronologische Sortierung geht verloren.

Besser:

SELECT
    TO_CHAR(
        TRUNC(rechnungsdatum, 'MM'),
        'FMMonth YYYY',
        'NLS_DATE_LANGUAGE=GERMAN'
    ) AS monat,
    SUM(nettobetrag) AS summe
FROM rechnungen
GROUP BY TRUNC(rechnungsdatum, 'MM')
ORDER BY TRUNC(rechnungsdatum, 'MM');

Damit bleibt der echte Monatswert Grundlage für Gruppierung und Sortierung. Nur die sichtbare Bezeichnung wird formatiert.

4. Zahlen bereits vor der Berechnung formatieren

Problematisch:

SELECT
    TO_CHAR(nettobetrag, 'FM999D00') * 1.20
FROM rechnungen;

TO_CHAR liefert Text zurück. Für weitere Berechnungen sollte immer der ursprüngliche Zahlenwert verwendet werden.

Besser:

SELECT
    TO_CHAR(
        nettobetrag * 1.20,
        'FM999G999G990D00',
        'NLS_NUMERIC_CHARACTERS='',.'''
    ) AS bruttobetrag
FROM rechnungen;

Zuerst wird gerechnet, danach wird ausschließlich das Endergebnis formatiert.

5. MI bei Datumsformaten und Zahlenformaten verwechseln

Bei Datumsformaten steht MI für Minuten:

TO_CHAR(SYSDATE, 'HH24:MI')

Bei Zahlenformaten steht MI für ein nachgestelltes Minuszeichen:

TO_CHAR(-125, 'FM999MI')

Die Bedeutung ergibt sich aus dem Datentyp und dem verwendeten Formatmodell.

TO_CHAR oder TRIM?

Bei einem gepolsterten Monatsnamen könnte auch TRIM verwendet werden:

SELECT TRIM(
           TO_CHAR(
               DATE '2026-05-01',
               'MONTH',
               'NLS_DATE_LANGUAGE=GERMAN'
           )
       ) AS monat
FROM dual;

Das funktioniert, ist aber bei reinen Formatierungsaufgaben meist unnötig kompliziert.

Direkter:

SELECT TO_CHAR(
           DATE '2026-05-01',
           'FMMONTH',
           'NLS_DATE_LANGUAGE=GERMAN'
       ) AS monat
FROM dual;

TRIM bleibt sinnvoll, wenn bereits vorhandene Texte bearbeitet werden. Für das Verhalten eines Oracle-Formatmodells ist FM normalerweise die klarere Lösung.

Kompakte Praxisbeispiele

Deutsches Datum

TO_CHAR(
    datum,
    'DD.MM.YYYY'
)

Deutsches Datum mit ausgeschriebenem Monat

TO_CHAR(
    datum,
    'FMDD. Month YYYY',
    'NLS_DATE_LANGUAGE=GERMAN'
)

Datum und Uhrzeit

TO_CHAR(
    datum,
    'DD.MM.YYYY HH24:MI:SS'
)

ISO-ähnliche Ausgabe

TO_CHAR(
    datum,
    'YYYY-MM-DD'
)

Deutscher Geldbetrag

TO_CHAR(
    betrag,
    'FM999G999G990D00',
    'NLS_NUMERIC_CHARACTERS='',.'''
) || ' €'

Negativer Geldbetrag mit nachgestelltem Minus

TO_CHAR(
    betrag,
    'FM999G999G990D00MI',
    'NLS_NUMERIC_CHARACTERS='',.'''
) || ' €'

Monat ohne zusätzliche Leerzeichen

TO_CHAR(
    datum,
    'FMMONTH',
    'NLS_DATE_LANGUAGE=GERMAN'
)

Häufige Fragen

Warum fügt Oracle bei MONTH Leerzeichen ein?

Oracle füllt ausgeschriebene Monatsnamen standardmäßig auf die Länge des längsten Monatsnamens der jeweiligen Sprache auf. Dadurch besitzen alle Ausgaben eine einheitliche Breite.

Wie entferne ich Leerzeichen hinter Monatsnamen?

Mit dem Formatmodifikator FM:

TO_CHAR(datum, 'FMMONTH')

Warum steht vor einer positiven Zahl ein Leerzeichen?

Oracle reserviert standardmäßig eine Position für ein mögliches Vorzeichen. FM entfernt diese Auffüllung.

TO_CHAR(123, 'FM999')

Wie formatiere ich eine Zahl mit deutschem Dezimalkomma?

TO_CHAR(
    zahl,
    'FM999G999D00',
    'NLS_NUMERIC_CHARACTERS='',.'''
)

Wie setze ich das Minuszeichen hinter die Zahl?

Mit MI am Ende des Formatmodells:

TO_CHAR(-125, 'FM999MI')

Wie erhalte ich deutsche Monatsnamen?

Mit dem dritten Parameter:

TO_CHAR(
    datum,
    'FMMonth YYYY',
    'NLS_DATE_LANGUAGE=GERMAN'
)

Kann ich nach einer mit TO_CHAR formatierten Zahl weiterrechnen?

Technisch kann Oracle versuchen, den Text wieder implizit in eine Zahl umzuwandeln. Das sollte vermieden werden. Berechnungen gehören vor TO_CHAR; die Funktion sollte erst für die endgültige Anzeige eingesetzt werden.

Fazit

TO_CHAR ist die zentrale Oracle-Funktion für die kontrollierte Ausgabe von Datumswerten, Zeitstempeln und Zahlen.

Die wichtigsten Regeln sind:

  • FM entfernt automatische Leerzeichen und führende Nullen.
  • MI setzt das Minuszeichen hinter eine Zahl.
  • S gibt ein ausdrückliches Plus- oder Minuszeichen aus.
  • D und G verwenden konfigurierbare Dezimal- und Gruppierungszeichen.
  • NLS_DATE_LANGUAGE stabilisiert Monats- und Wochentagsnamen.
  • NLS_NUMERIC_CHARACTERS stabilisiert Zahlenformate.
  • TO_CHAR sollte erst für die endgültige Darstellung verwendet werden.
  • Sortierung, Gruppierung, Filterung und Berechnung sollten mit den ursprünglichen Datums- und Zahlenwerten erfolgen.

Damit bleiben SQL-Abfragen unabhängig von Session-Einstellungen, leichter wartbar und für Berichte, Exporte sowie Anwendungen zuverlässig verwendbar.