A customer wanted me to look into why his two databases running the exact same application code were returning different time zones.
select name, created,(select dbtimezone from dual) "dbtimezone"
from v$database;
NAME | CREATED | dbtimezone |
---|---|---|
testdb1 | 25.04.2016 16:40:12 | +02:00 |
NAME | CREATED | dbtimezone |
---|---|---|
testdb2 | 08.11.2017 14:07:51 | +01:00 |
The os-command date +"%Z %z" returned CEST +0200 on both servers. Why the difference?
It didn't take long to find a good answer from Oracle about this topic.
Oracle states:
The database timezone is the time zone of the location where the database is installed
and
Use the SET TIME_ZONE clause to set the time zone of the database. If you do not specify the SET TIME_ZONE clause, then the database uses the operating system time zone of the server.
And also, from the document "Timestamps & time zones - Frequently Asked Questions (Doc ID 340512.1)":
If not specified with the CREATE DATABASE statement, the database time zone defaults to the server's O/S time zone offset. Note that if your server runs in a time zone affected by DST, then the database time zone would default to whatever the current offset is at the time of database creation, so you can have databases created with the same script on the same server with a different database time zone.
In Norway, we use DST, more commonly referred to as "summertime" and "wintertime". The first datbase was installed April 25th, after the server had switched to summertime. The second database was installed November 8th, after the server had switched to wintertime.
Oracle continues with the following about the database time zone:
The database time zone is not as important as it sounds. First of all it does not influence functions like sysdate, or systimestamp.
These function take their contents (date and time, and in the case of systimestamp also time zone) completely from the OS without any "Oracle" intervention.
and
A common misconception is that the database timezone needs to be "your" timezone. This is NOT true.
The database timezone has NO relation with "where" the server is located.
There is NO advantage whatsoever in using your timezone or a named timezone as database timezone.
The best setting for dbtimezone is simply +00:00 (or any other OFFSET like -09:00, +08:00, ...),
if your current dbtimezone value is an OFFSET then please leave it like it is.