Wer schon mal mit dem JSON Date Datentyp gearbeitet hat, ist sich dessen Problemen sicherlich bewusst.
Wir wollen uns im nachfolgenden Atrikel dem Problem mal annehmen:
Nehmen wir mal die in Oracle 21c neue eingeführte Funktion json_scalar und json_serialize
JSON_SCALAR wandelt einen Text/ ein Datum oder eine Anzahl in eine interne BLOB Repräsentanz.
SELECT json_scalar(date '2021-01-01') as datum FROM dual;
DATUM
--------------------------------------------
22323032312D30312D30315430303A30303A303022
Wenn wir das zurückwandeln passiert folgendes:
SELECT json_serialize( (date '2021-01-01')) as datum FROM dual;
DATUM
---------------------
"2021-01-01T00:00:00"
Da fallen einem gleich zwei Problemzonen ins Auge:
1. "" am Anfang / Ende
2. ein T zwischen Datum und Uhrzeit
Der erste Versuch scheitert deswegen auch:
select to_date(json_serialize(json_scalar(date '2021-01-01')),'YYYY-MM-DD"T"HH24:MI:SS') as scalar_datum
from dual;
ORA-01841: (Volles) Jahr muss zwischen -4713 und +9999 liegen und darf nicht 0 sein
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
Das liegt an der etwas eigenartigen Behandlung von Gänsefüßen bei Oracle Strings
select to_date('"01.01.01"') from dual;
ORA-01858: Ein nicht numerisches Zeichen wurde gefunden, während ein numerisches Zeichen erwartet wurde
01858. 00000 - "a non-numeric character was found where a numeric was expected"
oder auch
select to_date('"01.01.01"','"DD.MM.YY"') from dual;
RA-01861: Literal stimmt nicht mit Formatzeichenfolge überein
01861. 00000 - "literal does not match format string"
auch das geht schief:
select to_date('"01.01.01"','"""DD.MM.YY"""') from dual;
ORA-01861: Literal stimmt nicht mit Formatzeichenfolge überein
01861. 00000 - "literal does not match format string"
Deshalb lösen wir das Problem mit zwei Funktionen:
1. Wir ersetzen "" durch nix
2. Wir konvertieren den String mit Hilfe der Funktion to_date und dem Format String 'YYYY-MM-DD"T"HH24:MI:SS'
select
to_date(replace(json_serialize(json_scalar(date '2021-01-01')),'"',''),'YYYY-MM-DD"T"HH24:MI:SS') as scalar_datum
from dual;
SCALAR_DATUM
-------------------
01.01.2021 00:00:00
Weitere Tipps erhalten Sie in einem unserer Oracle Kurse...