=head1 INTRO Every date in RT's DB is stored in UTC format. This affects charts groupped by time periods (Annually, Monthly, etc.). To produce charts that are in a specific timezone we have to use DB's specific functions to convert time. Each DB has very different requirements. =head1 CONFIGURATION This code is experimental and you can turn it on and off using boolean option $ChartsTimezonesInDB in the RT config. =head1 DATABASE SPECIFIC NOTES =head2 mysql Time can not just be converted using numeric time shift as this shift value depends on day saving time properties of the time zone. mysql since 4.1.3 supports named timezones, but you have to fill special tables with up to date data. On modern systems it's Usually very easy: mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql mysql's doc recommends to restart server. Read more about timezones in mysql in the following document http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . =head2 Postgres Postgres database uses system's functions to deal with timezones. You shouldn't do anything particular except making sure that data in F is up to date. On some systems this means upgrading a system package. =head3 Note for users of Pg 7.2 and older or users upgraded from those You should be sure that timestamps in RT DB have no TZ set. TIMESTAMP column type in Postgres prior to Pg 7.3 has timezone info by default. In newer versions it's not the case anymore. If you have such system then you should alter columns. =head2 Other databases There is no implementation for other DBs, yet. =head1 FOR DEVELOPERS =head2 Postgres We use timestamp type for all datetime fields. It either has timezone info or not, by default since Pg 7.3 it has no timezone. Conversion is kinda tricky: timezone('Europe/Moscow', timezone('UTC', column_without_tz_info)) timezone('to_tz', timezone('from_tz', column_without_tz_info)) http://www.postgresql.org/docs/7.4/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT This function flips HAS_TZ flag on the argument. First call makes no conversion, but flips HAS_TZ flag. So next call flips it back and does actual conversion. http://www.postgresql.org/docs/7.4/static/datatype-datetime.html#DATATYPE-TIMEZONES =head2 mysql Once there is a timezone info loaded in tables on the server we have all the same set of named timezones like in system and DateTime (DateTime project has copy of the TZ data in a module). CONVERT_TZ(TS, from, to) exists since mysql 4.1.3. Note that it takes timestamp, so supports limitted range (usuall 1970-2038). =head2 Oracle Look at FROM_TZ function. =head2 SQLite As far as I can see has no support. =cut