今天给大家介绍下GBase 8a支持的日期和时间类型,如下表:

类型名称

最小值

最大值

格式

DATE

0001-01-01

9999-12-31

YYYY-MM-dd

DATETIME

0001-01-01 00:00:00.000000

9999-12-31 23:59:59.999999

YYYY-MM-dd HH:MI:SS.ffffff

TIME

-838:59:59

838:59:59

HHH:MI:SS

TIMESTAMP

1970-01-01 08:00:01

2038-01-01 00:59:59

YYYY-MM-DD HH:MI:SS

当使用日期和时间类型时,用户应当提供正确的格式,如:YYYY-MM-DD、YYYY-MM-DD HH:MI:SS。

1 DATE

日期类型。支持的范围是“0001-01-01”到“9999-12-31”。

GBase 8a MPP Cluster以“YYYY-MM-DD”格式显示DATE值。

示例

示例1:插入一个标准的DATE值。

gbase> CREATE TABLE products (productDate DATE);
Query OK, 0 rows affected
gbase> INSERT INTO products(productDate) VALUES('2010-09-01');
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+-------------+
| productDate |
+-------------+
| 2010-09-01  |
+-------------+
1 row in set

示例2:插入一个NULL值。

gbase> CREATE TABLE products (productDate DATE);
Query OK, 0 rows affected
gbase> INSERT INTO products(productDate) VALUES(NULL);
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+-------------+
| productDate |
+-------------+
| NULL        |
+-------------+
1 rows in set

示例3:插入一个非法的DATE值,系统报告错误信息。

gbase> CREATE TABLE products (productDate DATE);
Query OK, 0 rows affected
gbase> INSERT INTO products(productDate) VALUES('2010-09-31');
ERROR 1292 (22007): Incorrect date value: '2010-09-31' for column 'productDate' at row 1

2 TIME

GBase 8a MPP Cluster以“HH:MM:SS”格式(或“HHH:MM:SS”格式)检索和显示TIME值,该值为字符串。

TIME的范围是“-838:59:59”到“838:59:59”。TIME类型不仅可以用于表示一天的时间,而且可以用来表示所经过的时间或两个事件之间的时间间隔(这可能比24小时大许多或是一个负值)。

对于以字符串指定的包含时间界定符的TIME值,小于10的时、分或秒,可以不指定为两位数值。“8:3:2”与“08:03:02”是一致的。

TIME值可以多种格式指定:
一个'D HH:MM:SS.fraction'格式的字符串。下面所示的任一种“宽松”的语法均可以被使用:'HH:MM:SS.fraction','HH:MM:SS','HH:MM','D HH:MM:SS','D HH:MM','D HH',或'SS'。这里的D 是一个在0-34 之间的天数。注意,fraction 部分可以精确到微秒。

示例

示例1:插入一个标准的TIME值。

gbase> CREATE TABLE products (producttime TIME);
Query OK, 0 rows affected
gbase> INSERT INTO products(producttime) VALUES('12:35:23');
Query OK, 1 row affected
gbase> SELECT producttime FROM products;
+-------------+
| producttime |
+-------------+
| 12:35:23    |
+-------------+
1 row in set

示例2:插入一个NULL值。

gbase> CREATE TABLE products (producttime TIME);
Query OK, 0 rows affected
gbase> INSERT INTO products(producttime) VALUES(NULL);
Query OK, 1 row affected
gbase> SELECT producttime FROM products;
+-------------+
| producttime |
+-------------+
| NULL        |
+-------------+
1 rows in set

示例3:插入一个非法的TIME值,系统报告错误信息。

gbase> CREATE TABLE products (producttime TIME);
Query OK, 0 rows affected
gbase> INSERT INTO products(producttime) VALUES('14:08:89');
ERROR 1292 (22007): Incorrect time value: '14:08:89' for column 'producttime' at row 1

3 DATETIME

GBase 8a MPP Cluster以“YYYY-MM-DD HH:MI:SS.fraction”格式显示DATETIME值。其中fraction表示微秒格式,最大支持6位数字。
日期和时间的组合类型。支持的范围是“0001-01-01 00:00:00.000000”到“9999-12-31 23:59:59.999999”。

示例

示例1:插入一个合法的DATETIME值。

gbase> CREATE TABLE products (productDate DATETIME);
Query OK, 0 rows affected
gbase> INSERT INTO products(productDate) VALUES('2010-09-01 12:09:44');
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+---------------------+
| productDate         |
+---------------------+
| 2010-09-01 12:09:44 |
+---------------------+
1 row in set

示例2:插入系统当前的DATETIME值。

gbase> INSERT INTO products(productDate) VALUES(NOW());
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+---------------------+
| productDate         |
+---------------------+
| 2013-10-16 17:51:38 |
+---------------------+
1 row in set

示例3:插入一个NULL值。

gbase> INSERT INTO products(productDate) VALUES(NULL);
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+-------------+
| productDate |
+-------------+
| NULL        |
+-------------+
1 row in set

示例4:插入一个带有微秒的DATETIME数值。

gbase> INSERT INTO products(productDate) VALUES('2013-09-15 12:09:44.123456');
Query OK, 1 row affected
gbase> SELECT productDate FROM products;
+----------------------------+
| productDate                |
+----------------------------+
| 2013-09-15 12:09:44.123456 |
+----------------------------+
1 row in set

示例5:插入一个非法的DATETIME值,系统将报告错误信息。

gbase> INSERT INTO products(productDate) VALUES('2010-09-31 12:09:44');
ERROR 1292 (22007): Incorrect datetime value: '2010-09-31 12:09:44' for column 'productDate' at row 1

4 TIMESTAMP

TIMESTAMP类型仅仅是为了兼容SQL标准,不建议使用此数据类型,推荐使用DATETIME数据类型。

TIMESTAMP的格式为“YYYY-MM-DD HH:MI:SS”,支持的范围是“1970-01-01 08:00:01”到“2038-01-01 00:59:59”。

如需Timestamp支持精度到微秒,需要开启参数:_gbase_timestamp_append_prec

默认值为OFF(0),timestamp精度支持到秒,如果插入的数据带有微秒,也只保存到秒,微秒丢弃,无法查询。

值设置为1时代表开启微秒精度,timestamp精度支持到微秒,如果数据带有微秒,保存6位(0~999999),不足6位以0补足6位。

Timestamp开启微秒精度后,DQL、DML、insert select 、导入导出中均支持操作六位精度类型,dblink访问远端数据表带精度的数据精度可以被保留。并在如下时间函数中支持指定精度:current_timestamp、localtime、localtimestamp、now及sysdate

gbase> CREATE TABLE t (a int,b timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c timestamp DEFAULT '2013-01-01 00:00:01');
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t;
+-------+----------------------------------------------------------------+
| Table | Create Table                                                   |
+-------+----------------------------------------------------------------+
| t     | CREATE TABLE "t" (
 "a" int(11) DEFAULT NULL,
 "b" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 "c" timestamp NOT NULL DEFAULT '2013-01-01 00:00:01'
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace'        |
+-------+----------------------------------------------------------------+
1 row in set
gbase> show variables like '_gbase_timestamp_append%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| _gbase_timestamp_append_prec | OFF   |
+------------------------------+-------+
gbase> create table t(a int,b timestamp);
Query OK, 0 rows affected (Elapsed: 00:00:02.19)
gbase> insert into t values(1,now());
Query OK, 1 row affected (Elapsed: 00:00:00.86)
gbase> insert into t values(2,'2021-3-4 12:12:12.123456');
Query OK, 1 row affected (Elapsed: 00:00:00.17)
gbase> select * from t;
+------+---------------------+
| a    | b                   |
+------+---------------------+
|    1 | 2021-04-05 14:42:41 |
|    2 | 2021-03-04 12:12:12 |
+------+---------------------+
2 rows in set (Elapsed: 00:00:01.11)
gbase> show variables like '%_gbase_timestamp_append_prec%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| _gbase_timestamp_append_prec | ON    |
+------------------------------+-------+
gbase> update t set b='2021-03-04 15:12:12.123';
Query OK, 4 rows affected (Elapsed: 00:00:00.07)
Rows matched: 4  Changed: 4  Warnings: 0
gbase> select * from t;
+------+----------------------------+
| a    | b                          |
+------+----------------------------+
|    1 | 2021-03-04 15:12:12.123000 |
|    2 | 2021-03-04 15:12:12.123000 |
|    3 | 2021-03-04 15:12:12.123000 |
|    4 | 2021-03-04 15:12:12.123000 |
+------+----------------------------+
4 rows in set (Elapsed: 00:00:00.03)
gbase> insert into t values(5,now());
Query OK, 1 row affected (Elapsed: 00:00:00.41)
gbase> select * from t;
+------+----------------------------+
| a    | b                          |
+------+----------------------------+
|    1 | 2021-03-04 15:12:12.123000 |
|    2 | 2021-03-04 15:12:12.123000 |
|    3 | 2021-03-04 15:12:12.123000 |
|    4 | 2021-03-04 15:12:12.123000 |
|    5 |        2021-04-05 14:55:49 |
+------+----------------------------+
5 rows in set (Elapsed: 00:00:00.02)
gbase> insert into t values(6,now(3));
Query OK, 1 row affected (Elapsed: 00:00:00.34)
gbase> select * from t;
+------+----------------------------+
| a    | b                          |
+------+----------------------------+
|    1 | 2021-03-04 15:12:12.123000 |
|    2 | 2021-03-04 15:12:12.123000 |
|    3 | 2021-03-04 15:12:12.123000 |
|    4 | 2021-03-04 15:12:12.123000 |
|    5 |        2021-04-05 14:55:49 |
|    6 | 2021-04-05 14:56:03.737000 |
+------+----------------------------+
6 rows in set (Elapsed: 00:00:00.03)
gbase> insert into t values(7,now(6));
Query OK, 1 row affected (Elapsed: 00:00:00.07)
gbase> select * from t;
+------+----------------------------+
| a    | b                          |
+------+----------------------------+
|    1 | 2021-03-04 15:12:12.123000 |
|    2 | 2021-03-04 15:12:12.123000 |
|    3 | 2021-03-04 15:12:12.123000 |
|    4 | 2021-03-04 15:12:12.123000 |
|    5 |        2021-04-05 14:55:49 |
|    6 | 2021-04-05 14:56:03.737000 |
|    7 | 2021-04-05 14:56:18.279518 |
+------+----------------------------+
7 rows in set (Elapsed: 00:00:00.02)

TIMESTAMP使用限制

以下限制说明,是针对TIMESTAMP数据列自动更新时的场景:

使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性后,TIMESTAMP列在支持INSERT、UPDATE以及MERGE时,它的值自动更新。创建表时,一个表中可以定义一个或多个TIMESTAMP列,如果仅定义1个,那么DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性在创建时可以不予指定,系统会自动填加。如果需要定义多列,那么第一个TIMESTAMP列必须指定DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性,而后面其他TIMESTAMP列不能指定DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性。

注意:
参数_gbase_timestamp_append_prec是只读参数,且一旦值置为1后不允许再置回到0,修改该参数需要到所有节点的配置文件中修改后重启服务起效,修改建议将参数添加到gcluster/config/gbase_8a_gcluster.cnf和gnode/config/gbase_8a_gbase.cnf的[gbased]标签下,修改如下:
_gbase_timestamp_append_prec=1

GSSYS表和系统表不受该参数控制,且该参数没有针对单机开发,单机未测试,单机使用需谨慎。

以上就是今天的内容,感谢阅读!