The string is the hex version of what you would see in a DUMP, eg
SQL> create table t ( x timestamp with time zone );
Table created.
SQL> insert into t values ( systimestamp );
1 row created.
SQL> select x, dump(x) from t;
X
----------------------------------------------------------
DUMP(X)
----------------------------------------------------------
02-MAR-21 10.05.48.557000 AM +08:00
Typ=181 Len=13: 120,121,3,2,3,6,49,33,51,37,64,28,60
Converting the dump bytes to hex, you'd see
78,79,03,02,03,06,31,21,33,25,40,1C,3C
which is what appears in your SQL monitor.
Going back to the decimals, we can break this down into its bytes
- century + 100
- year + 100
- month
- day
- hour + 1
- minute + 1
- second + 1
- nanoseconds (4bytes)
- time zone hour + 20
- time zone minute + 60
so
120, 121 = 2021
3 = march
2 = 2nd
3 = 2am (UTC)
6 = 5mins
49 = 48seconds
33, 51, 37, 64 = 557000000 nanoseconds
28 = 8 hours forward (perth)
60 = 0 mins foward ( perth)
(For the nanoseconds:
33, 51, 37, 64 = 21,33,25,40 in hex, then
SQL> select to_number('21332540','xxxxxxxx') from dual;
TO_NUMBER('21332540','XXXXXXXX')
--------------------------------
557000000
I'll leave as an exercise to write a function that does the below:
SQL> select ts_from_monitor('7879021912040336E63AD0') from dual;
TS_FROM_MONITOR('7879021912040336E63AD0')
-------------------------------------------------------------------
25-FEB-21 05.03.02.921058000 PM
or you can wait until it appears on the blog in a few days :-)