Time Zone Support
The time zone in TiDB is decided by the global time_zone
system variable and the session time_zone
system variable. The default value of time_zone
is SYSTEM
. The actual time zone corresponding to System
is configured when the TiDB cluster bootstrap is initialized. The detailed logic is as follows:
- Prioritize the use of the
TZ
environment variable. - If the
TZ
environment variable fails, extract the time zone from the actual soft link address of/etc/localtime
. - If both of the above methods fail, use
UTC
as the system time zone.
You can use the following statement to set the global server time_zone
value at runtime:
SET GLOBAL time_zone = timezone;
Each client has its own time zone setting, given by the session time_zone
variable. Initially, the session variable takes its value from the global time_zone
variable, but the client can change its own time zone with this statement:
SET time_zone = timezone;
You can use the following statement to view the current values of the global, client-specific and system time zones:
SELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;
To set the format of the value of the time_zone
:
- The value 'SYSTEM' indicates that the time zone should be the same as the system time zone.
- The value can be given as a string indicating an offset from UTC, such as '+10:00' or '-6:00'.
- The value can be given as a named time zone, such as 'Europe/Helsinki', 'US/Eastern', or 'MET'.
The current session time zone setting affects the display and storage of time values that are zone-sensitive. This includes the values displayed by functions such as NOW()
or CURTIME()
.
create table t (ts timestamp, dt datetime);
Query OK, 0 rows affected (0.02 sec)
set @@time_zone = 'UTC';
Query OK, 0 rows affected (0.00 sec)
insert into t values ('2017-09-30 11:11:11', '2017-09-30 11:11:11');
Query OK, 1 row affected (0.00 sec)
set @@time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)
select * from t;
+---------------------|---------------------+
| ts | dt |
+---------------------|---------------------+
| 2017-09-30 19:11:11 | 2017-09-30 11:11:11 |
+---------------------|---------------------+
1 row in set (0.00 sec)
In this example, no matter how you adjust the value of the time zone, the value of the Datetime data type is not affected. But the displayed value of the Timestamp data type changes if the time zone information changes. In fact, the value that is stored in the storage does not change, it's just displayed differently according to different time zone setting.