VastbaseG100

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

Menu

支持无效日期

功能描述

Vastbase G100 在MySQL兼容模式下,针对DATE、DATETIME和TIMESTAMP数据类型,支持无效日期数据,可以接受无效日期数据的INSERT和UPDATE操作,并且可以把无效日期作为查询的条件。

用户在执行INSERT和UPDATE时,可以接受无效日期,例如下列日期“0000-00-00”,“2023-02-30”,“2023-03-32”,当遇到此类无效日期时不会报错,而是自动转换成“0000-00-00”,并提示相关的告警。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。

  • 仅Vastbase G100 V2.2 Build 10(Patch No.8)及以后版本支持此功能。

示例

1、创建并切换至兼容模式为MySQL的数据库db_mysql下。

create database db_mysql dbcompatibility 'B';
\c db_mysql;

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

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');

3、在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

4、查询表中数据。

SELECT * from test_tbl_1143583;

返回结果如下,insert插入的无效日期数据自动转换成“0000-00-00”:

    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)

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

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

返回结果依次为(update更新数据时发出告警并成功更新数据):

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)

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

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

返回结果如下(发出告警并成功删除数据):

WARNING:  date/time field value out of range: "0000-00-00"
LINE 1: DELETE FROM test_tbl_1143583 WHERE col1 = '0000-00-00';
                                                  ^
HINT:  Perhaps you need a different "datestyle" setting.
DELETE 2

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