
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。