VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

日期/时间类型

相比于原始的Vastbase,在MySQL兼容模式下新增如下日期/时间类型(原Vastbase的日期/时间类型请参考日期/时间类型):

类型 描述 存储空间
datetime datetime[n]用于设置显示毫秒后面的多少位,n表示获取的位数,取值为1~6。 8字节
  • datetime数据类型仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
  • datetime[n]数据类型的实现依赖Vastbase现有timestamp数据类型,因此,在一些场景中,例如\d元命令中,datetime数据类型会被显示成timestamp类型。
  • 当datetime[n]类型指定了小数位之后,如果datetime[n]类型的数据小数位都是0,则在Vastbase数据库中,受到timestamp数据类型的局限,其小数位上的0将不做显示。

支持无效日期

Vastbase在MySQL兼容模式下,针对DATE、DATETIME和TIMESTAMP数据类型,能够支持不同的无效日期数据处理策略。具体策略信息详见vastbase_sql_mode。 该功能仅在数据库兼容模式为MySQL时能够使用(即数据库初始化时指定DBCOMPATIBILITY='B') Vastbase对无效日期的处理策略默认为报错退出。可以通过更改vastbase_sql_mode的值进行变更。例如,通过将vastbase_sql_mode的值设置为包含no_zero_date,但不包含sql_mode_strict,使其支持用户在执行INSERT和UPDATE语句时,将诸如“0000-00-00”、“2023-02-30”、“2023-03-32”此类的无效日期自动转换成“0000-00-00”输入,并提示相关的Warning信息。

示例

示例1: datetime类型。

1、创建测试datetime类型的表test_mysql_type4并插入测试数据。

CREATE TABLE test_mysql_type4(c1 datetime);
INSERT INTO test_mysql_type4 values('2019-03-05 01:53:55.63');

2、验证datetime数据类型。

SELECT * FROM test_mysql_type4;

当结果显示如下信息,则表示验证完成。

     c1
--------------------------
 2019-03-05 01:53:55.63
(1 row)

示例2: 无效日期。

1、查看GUC参数vastbase_sql_mode的取值。

SHOW vastbase_sql_mode

安装后此参数未被修改时,默认的返回结果为:

 vastbase_sql_mode
-----------------------------------------------------------------------------------------------------
 ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length,sql_mode_strict,no_zero_date
(1 row)

2、将vastbase_sql_mode的值中跟无效日期处理策略相关的取值修改为包含no_zero_date,但不包含sql_mode_strict:

SET vastbase_sql_mode='ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length,no_zero_date';

3、创建测试表并插入数据。

CREATE TABLE test_tbl_1143583 (col1 DATE,col2 DATETIME,col3 TIMESTAMP);
INSERT INTO test_tbl_1143583 VALUES ('2020-01-01', '2020-01-01 13:30:00', '2020-01-01 23:30:00');
INSERT INTO test_tbl_1143583 VALUES ('2020-01-02', '2020-01-02 13:30:00', '2020-01-02 23:30:00');

4、在insert语句中使用无效日期。

INSERT INTO test_tbl_1143583 VALUES ('2020-01-32', '2020-01-02 13:30:00', '2020-01-02 13:30:00');

返回结果为:

WARNING:  date/time field value out of range: "2020-01-32"
LINE 1: INSERT INTO test_tbl_1143583 VALUES ('2020-01-32', '2020-01-...
                                             ^
HINT:  Perhaps you need a different "datestyle" setting.
CONTEXT:  referenced column: col1
INSERT 0 1

5、查询表中数据。

SELECT * from test_tbl_1143583;

返回结果为:

    col1    |        col2         |        col3
------------+---------------------+---------------------
 2020-01-01 | 2020-01-01 13:30:00 | 2020-01-01 23:30:00
 2020-01-02 | 2020-01-02 13:30:00 | 2020-01-02 23:30:00
 0000-00-00 | 2020-01-02 13:30:00 | 2020-01-02 13:30:00
(3 rows)

insert插入的无效日期数据自动转换成了0000-00-00

6、在update语句中使用无效日期并查询结果。

UPDATE test_tbl_1143583 SET col1 = '2020-01-32' WHERE col1 = '2020-01-01'; SELECT * from test_tbl_1143583;

返回结果为:

WARNING:  date/time field value out of range: "2020-01-32"
LINE 1: UPDATE test_tbl_1143583 SET col1 = '2020-01-32' WHERE col1 =...
                                           ^
HINT:  Perhaps you need a different "datestyle" setting.
CONTEXT:  referenced column: col1
UPDATE 1
    col1    |        col2         |        col3
------------+---------------------+---------------------
 2020-01-02 | 2020-01-02 13:30:00 | 2020-01-02 23:30:00
 0000-00-00 | 2020-01-02 13:30:00 | 2020-01-02 13:30:00
 0000-00-00 | 2020-01-01 13:30:00 | 2020-01-01 23:30:00
(3 rows)

7、在delete语句中使用无效日期并查询结果。

DELETE FROM test_tbl_1143583 WHERE col1 = '0000-00-00'; SELECT * from test_tbl_1143583;

返回结果为:

DELETE 2
    col1    |        col2         |          col3
------------+---------------------+------------------------
 2020-01-02 | 2020-01-02 13:30:00 | 2020-01-02 23:30:00+08
(1 row)

清理环境

DROP TABLE test_mysql_type4,test_tbl_1143583;
SET vastbase_sql_mode='ONLY_FULL_GROUP_BY,ANSI_QUOTES,pipes_as_concat,pad_char_to_full_length,sql_mode_strict,no_zero_date';