1 夏令时具体需求
1.1 功能需求
1.1.1 夏令时
夏令时也称夏日节约时间,是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提高日光的使用。支持时区是支持夏令时的前提,不同的时区对夏令时的支持不同。只有在使用夏令时的时区内,夏令时才能起作用
以美国为例:
从2007年起,每年3月的第二个星期天的凌晨2点开始,11月的第一个星期天的凌晨2点为止,为夏令时。其他的时间为冬令时或者当地的标准时间。
1.1.2 参数说明
system_time_zone参数: 显示操作系统的时区
time_zone: 当前ssion中gba使用的时区,ssion级变量,可在配置文件中使用default-time-zone进行设置,或使用t time_zone进行修改。
time_zone的值有三种形式:
a) system: time_zone的值同system_time_zone的值相同,如果配置文件里面没有设置,该值为默认值。
b) UTC表示的偏移:范围为 [-12:59, 13:00], 例如‘+8:00’ 表示的是东八区。
c) 时区名:从time_zone_name中能查出的时区的名字, 例如Asia/Shanghai 表示上海所在的时区。
1.1.3 系统表
时区用到的系统表如下:
time_zone
time_zone_name
time_zone_transition
time_zone_transition_type
支持润秒的时候需要用到下面的表:
time_zone_leap_cond
8.6.2Build33版本集群安装完后,已经加载好时区系统表。
升级的时候,需要手动加载gba_time_zone.sql到时区系统表。在安装包的gcinstall目录下的gba_data_timezone.sql文件。
执行gccli –uroot –Dgba < gba_data_timezone.sql,和各gnode节点执行gncli –u root –Dgba<file_name;
停止集群;然后重启集群使时区生效。
1.1.4 使用不同的时区
gba> t time_zone='+8:00';
Query OK, 0 rows affected (Elapd: 00:00:00.00)
gba> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +08:00 |
+------------------+--------+
2 rows in t (Elapd: 00:00:00.00)
gba> t time_zone='SYSTEM';
Query OK, 0 rows affected (Elapd: 00:00:00.00)
gba> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in t (Elapd: 00:00:00.00)
gba> t time_zone='US/Central';
Query OK, 0 rows affected (Elapd: 00:00:00.00)
如果数据库不能正常支持夏令时,这一步骤会报错“ERROR 1298 (HY000): Unknown or incorrect time zone: 'US/Central'”
gba> show variables like '%time_zone%';
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | CST |
| time_zone | US/Central |
+------------------+------------+
2 rows in t (Elapd: 00:00:00.00)
1.1.5 使用夏令时
a) 在夏令时内,系统时间跟gba内时间一致。
修改系统时区
cp /usr/share/zoneinfo/US/Pacific /etc/localtime
修改系统时间为夏令时时间内:
[root@localhost ~]# date -s '2017-3-11 5:00:00'
Sat Mar 11 05:00:00 PST 2017
[root@localhost ~]# hwclock -w
[root@localhost ~]# date '+%Y-%m-%d %H:%M:%S'
2017-03-11 05:04:22
gba> t time_zone='SYSTEM';
Query OK, 0 rows affected (Elapd: 00:00:00.00)
gba> show variables like '%zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | PST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in t (Elapd: 00:00:00.00)
gba> \! date '+%Y-%m-%d %H:%M:%S'
2017-03-11 05:06:06
gba> lect now();
+---------------------+
| now() |
+---------------------+
| 2017-03-11 05:06:10 |
+---------------------+
1 row in t (Elapd: 00:00:00.00)
\! date 的结果是操作系统时间,Select now()的结果是数据库时间,数据库时间与操作系统时间一致。系统时区支持夏令时,数据库即支持夏令时。
b) convert_tz函数,在支持夏令时的时区内转换。
gba> SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00 |
+------------------------------------------------------------+
1 row in t (Elapd: 00:00:00.02)
gba> SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00 |
+------------------------------------------------------------+
如果数据库不能正常支持夏令时,以上结果集为NULL。