SELECT TO_CHAR(SYSDATE, \'YYYY-MM-DD HH24:MI\')
,TO_CHAR(CURRENT_DATE, \'YYYY-MM-DD HH24:MI\')
,TO_CHAR(SYSTIMESTAMP, \'YYYY-MM-DD HH24:MI TZR\')
There are actually 3 timezones here, not 2
In your first example, I can see that the session TZ is UTC-6, the database TZ is UTC, and the database OS timezone is UTC-6.
In your second example, I can see that the session TZ is UTC-6, the database TZ is UTC+2, and the database OS timezone is UTC+1.
The details are in the fine print of the documentation. Take a look at the Return Type, and the actual Timezone the DATE or TIMESTAMP is calculated in.
Return Type, indicates whether or not the Timezone is available within the Datatype. If you try to print TZR if datatype does not carry TimeZone, then it will just show up as +00:00 (doesn't mean it is GMT). Otherwise It will show the TimeZone matching either the Database or Session as indicated.
Time Zone, indicates in which Timezone the time is calculated. For matching TimeZone, the same Date/Time will be shown (HH24:MI).
Note that none of the FUNCTIONS return TIME in the Time Zone set with the DB TIME_ZONE (or as returned by the DBTIMEZONE function). That is, none of the functions also return a datatype of TIMESTAMP WITH LOCAL TIME ZONE. Howver you can convert the output of any of the functions that does return a timezone into a different timezone (including DBTIMEZONE) as follows:
SELECT SYSTIMESTAMP AT TIME ZONE DBTIMEZONE FROM DUAL;
More information on my blog.
Use UTC time and offset your timezone from UTC, To get UTC in Oracle use SYS_EXTRACT_UTC
Convert SYSTEMDATE to UTC
select sys_extract_utc(systimestamp) from dual;
As for the difference the definition from Oracle documentation might help to explain: