====== 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]]