While fetching information from Instructure’s Bridge learning management system API, I noticed that their course completion timestamps include miliseconds (e.g. 2020-06-30T08:19:16.413-07:00). I needed to load this value into a DATE-typed column in an Oracle database table.
With the_completion_date_string representing my incoming datetime from Bridge, at first I tried to use TO_DATE():
TO_DATE(
the_completion_date_string
, 'yyyy-mm-dd"T"hh24:mi:ss.FF3TZH:TZM'
)
Unfortunately, that produced an ORA-01821 error of date format not recognized.
Justin Cave pointed out on StackOverflow that since Oracle’s DATE data type doesn’t store miliseconds, its TO_DATE() function doesn’t recognize format strings that mention miliseconds.
I checked to see what would happen if I just cut off .FF3 (which represented the period and the miliseconds) and TZH:TZM (which represented the negative or positive timestamp indicating offset from UTC time) from my format string:
TO_DATE(
the_completion_date_string
, 'yyyy-mm-dd"T"hh24:mi:ss'
)
No dice. That procduced an ORA-01830 error of date format picture ends before converting entire input string.
Combining Justin’s advice with Peter Nosko’s tip on a different StackOverflow question, it turns out that the correct fragment of code is:
CAST(
TO_TIMESTAMP_TZ(
the_completion_date_string
, 'yyyy-mm-dd"T"hh24:mi:ss.FF3TZH:TZM'
)
AS DATE
)
My entire solution for parsing the JSON from a Bridge HTTP REST API response into an Oracle VARCHAR2 as implied by my use of the_completion_date_string involved other function calls:
- Functions in the PL/SQL
UTL_FILEpackage (official documentation) -
JSON_OBJECT_T.PARSE(), available since 12.2 per Carsten Czarski (official documentation) - The
.get_String()function built intoJSON_OBJECT_T-typed data (official documentation & examples)
I’ll have to save all that for another post.
Top comments (0)