日期/时间类型
相比于原始的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+08
2020-01-02 | 2020-01-02 13:30:00 | 2020-01-02 23:30:00+08
0000-00-00 | 2020-01-02 13:30:00 | 2020-01-02 13:30:00+08
(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+08
0000-00-00 | 2020-01-02 13:30:00 | 2020-01-02 13:30:00+08
0000-00-00 | 2020-01-01 13:30:00 | 2020-01-01 23:30:00+08
(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';