Auswahl  

Oracle JSON Date Datentyp Problem 

Oracle
PL/SQL:SQL
RDBMS 21.1
14.01.21 (MP)
14.01.21
Oracle JSON json_serialize json_scalar

Passende Schulungen zum Thema

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...

Weitere Interessante Kurs-Tipps zum Thema