====== Feldformatierungen, Suchen & Ersetzen von Feldinhalten ======
===== TO_CHAR() =====
Wird benutzt, um den Inhalt eines Feldes in einen String umzuwandeln.\\
Beispiel:
select to_char('12345,69','$99,999.99') geld from dual;
GELD
______________
$12,345.69
-- Oder wenn immer die Währung der lokalen Einstellung benutzt werden soll
select to_char('12345,69','L99,999.99') geld from dual;
GELD
______________
€12,345.69
Wichtig! Wenn der Wert, der mit ''TO_CHAR'' vor der Ausgabe noch einer Berechnung unterzogen werden muss, dann muss die Berechnung vor der Umwandlung von to_char passieren. Sprich die Berechnung läuft innerhalb der Klammern des to_char Operators:
select to_char(12345.69 *2,'L99,999.99') geld from dual;
GELD
_____________________
€24,691.38
===== TO_DATE() =====
Wandelt einen gegebenen Zahlenstring in einen Zeitstempel um.\\
Beispiel:
-- Die default Ausgabe ist DD.MM.YY
select to_date('2026.01.06', 'YYYY.DD.MM') datum from dual;
DATUM
___________
01.06.26
Folgende Formatierungen für Zeitstempel gibt es:
* DD : Tag 01-31
* MM : Monat 01-12
* MON / Mon : Monatskürzel (3-letter)
* MONTH / Month : Voll ausgeschriebener Monat
* YYYY : 4-Stellige Jahreszahl
* YY : 2-Stellige Jahreszahl
* HH24 : Stunden 1-23
* HH : Stunden 1-12
* MI : Minuten
* SS : Sekunden
* AM / PM : Platzhalter für die Tageszeit. Egal welches von beiden gesetzt ist, Oracle wird hier immer die richtige Tageszeit angeben.
Beispiel:
select to_char(sysdate,'HH24:MI:SS') "24H Format", to_char(sysdate, 'HH:MI:SS AM') "12H Format" from dual;
24H Format 12H Format
_____________ ______________
15:40:50 03:40:50 PM
===== ADD_MONTHS() =====
Addiert auf ein gegebenes Datum eine angegebene Zahl von Monaten.\\
Beispiel:
select sysdate, add_months(sysdate, 2) future_date from dual;
SYSDATE FUTURE_DATE
___________ ______________
01.04.26 01.06.26
**Zusatzinfo:**\\
Bei größeren Sprüngen, wie z.B. Jahren, kann man auch mit 12 rechnen.\\
Beispiel:
-- Zeigt das Systemdatum plus 3 Jahre
select add_months(sysdate, 12*3) from dual;
Braucht man einen Zeitstempel kleiner als einen Monat, kann man mit ''SYSDATE'' direkt rechnen, wobei '1' einem Tag entspricht (Dies gilt für jede Art von Zeitstempel).\\
Da SYSDATE per default nur das Datum liefert, muss man es mit TO_CHAR entsprechend formatieren.
* ''SYSDATE + 3'' => 3 Tage später
* ''SYSDATE - 1'' => 1 Tag früher
* ''SYSDATE + 1/24'' => eine Stunde später
* ''SYSDATE + 1/1440'' => eine Minute später
Beispiel:
-- Aufaddieren einer Stunde. Da SYSDATE per default nur das Datum liefert, muss man es mit TO_CHAR entsprechend formatieren.
select to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS') jetzt , to_char(sysdate + 1/24, 'DD.MM.YYYY HH24:MI:SS') zukunft from dual;
JETZT ZUKUNFT
______________________ ______________________
01.04.2026 14:53:20 01.04.2026 15:53:20
===== NEXT_DAY() =====
Berechnet das Datum eines gegebenen Tages ab einem bestimmten Datum.\\
Beispiel:
select next_day('01.06.26', 'MONDAY') "Nächster Montag" from dual;
Nächster Montag
__________________
08.06.26
**VORSICHT!**\\
In dem Beispiel oben wird der ''08.06.26'' errechnet. Dies bedeutet, dass der ''01.06.26'' ebenfalls ein Montag ist.\\
Sollte die Aufgabe sein, den ersten Montag im Monat zu finden, dann **MUSS** man ab Ultimo des Vormonats suchen!\\
Das könnte z.B. wie folgt aussehen:
select next_day(to_date('01.06.26')-1, 'MONDAY') "first Monday on Month" from dual;
first Monday on Month
________________________
01.06.26
Um sicher zu sein, dass ''MONDAY'' auch als Montag erkannt wird, sollte man ''NLS_DATE_LANGUAGE=ENGLISH'' setzen.
ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';
-- Anzeigen aller NLS Werte:
SHOW NLS
-- oder speziell nur NLS_DATE_LANGUAGE
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_LANGUAGE';
VALUE
___________
AMERICAN
===== CASE =====
(Fällt auch unter Aggregation)\\
Wird in der ''SELECT'' Klausel zum Suchen & Ersetzen von Rückgabewerten einzelner Felder benutzt.\\
Dabei kann man das Feld entweder hinter den ''CASE'' setzen oder man baut es in den ''WHEN'' Operator ein.\\
Beispiel 1:
SELECT distinct JOB_ID,
CASE job_id
WHEN 'AD_PRES' then 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
ELSE '0'
END grade
FROM EMPLOYEES;
Hier hat man eine absolute Bedingung. Der Feldwert ist richtig, wenn er einen bestimmten String hat.
Man kann aber auch mit Vergleichsoperatoren gegen den Feldwert arbeiten.
Beispiel 2:
select last_name,
CASE
WHEN employee_id < 111 THEN 'too small'
when employee_id = 111 then 'PERFECT'
when employee_id > 111 then 'to big'
END "ID is"
from employees;
Hier wird anstelle der employee_id ein entsprechender Ersatz zurückgegeben.
===== DECODE() =====
(Fällt auch unter Aggregation)\\
Funktioniert ähnlich wie Beispiel 1 von ''CASE''.\\
Beispiel:
SELECT DISTINCT job_id,
DECODE(job_id,
'AD_PRES', 'A',
'ST_MAN', 'B',
'IT_PROG', 'C',
'0') grade
from EMPLOYEES;
Allerdings ist hier von Oracle die Empfehlung, besser ''CASE'' zu nutzen, weil dies im ANSI-SQL vorhanden ist.\\
''DECODE'' ist ein Operator, der nur in Oracle-SQL vorkommt und er ist schlechter zu lesen als die ''CASE'' Syntax.
''DECODE'' kommt nur noch in altem Oracle-SQL-Code vor.
[[opendocks:oracle-sql-nutshell-doku:nutshell-doku-01|Zurück]] - [[opendocks:oracle-sql-nutshell-doku:nutshell-doku-03|Weiter]]