VastbaseG100

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

Menu

逻辑操作符

功能描述

Vastbase在MySQL兼容模式下支持在逻辑运算符 AND 和 OR 的两侧使用日期时间类型datetime和timestamp。操作符对日期时间类型进行逻辑运算后返回布尔类型。

日期时间类型比较规则

  • 逻辑操作符 AND 两侧的操作数为合法的时间日期类型的前提下,“逻辑与”的运算规则如下:

    • 当 AND 左右两侧的操作数均为非0的日期时间类型,且不为 NULL 时,返回 t 。

    • 当一个或多个操作数指定的日期时间类型为 0 时,返回 f 。

    • 操作数中有任何一个为 NULL 时,返回 NULL 。

  • 逻辑操作符 OR 两侧的操作数为合法的时间日期类型的前提下,“逻辑或”的运算规则如下:

    • 左右两侧任意一个操作数为非0值时,不管另一个操作数为 0 还是 NULL ,都返回 t 。

    • 两个操作数均为 0 时,返回 f 。

    • 两个操作数分别为 0 和 NULL 时,返回 NULL。

    • 两个操作数均为NULL时,返回 NULL 。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

  • 在其它数据库兼容模式下,逻辑布尔运算符仅支持使用Boolean操作数执行逻辑运算。运算规则详见表1

  • MySQL兼容模式下的IF函数将timestamp类型0000-00-00 00:00:00判断为FALSE。

示例

示例1: SELECT查看AND对日期时间类型的比较结果。

select '2022-1-12 12:23:23' and '19980112122324';
select '2022-1-12 12:23:23'::datetime and  '20220112122324';
select '2022-1-12 12:23:23' and  '20220112122324':: timestamp;
select '20201229' and '0000-00-00 00:00:00';
select '00000000' and '0000-00-00 00:00:00';
select null and '2022-1-12 12:23:23'::datetime;

返回结果依次为:

 ?column?
----------
 t
(1 row)

 ?column?
----------
 t
(1 row)

 ?column?
----------
 t
(1 row)

 ?column?
----------
 f
(1 row)

 ?column?
----------
 f
(1 row)

 ?column?
----------

(1 row)

示例2: SELECT查看OR对日期时间类型的比较结果。

select datetime '2022-1-12 12:23:23' or  timestamp '20220112122324';
select NULL or timestamp '20220112122324';
select date '0000-00-00 00:00:00' or  date '20201229';
select '0000-00-00 00:00:00' or '00000000000000':: datetime;
select '0000-00-00 00:00:00' or NULL;

返回结果依次为:

 ?column?
----------
 t
(1 row)

 ?column?
----------
 t
(1 row)

 ?column?
----------
 t
(1 row)

 ?column?
----------
 f
(1 row)

 ?column?
----------

(1 row)

示例3: 结合表使用AND,OR操作符对日期时间类型进行比较。

1、创建包含日期时间类型的测试表并插入数据。

create table table_1160467 (
time_a timestamp ,
time_b timestamp
);
insert into table_1160467(time_a, time_b) values ('2022-1-12 12:23:23', '20220112122324');

2、执行查询语句:从测试表中获取日期时间类型数据,嵌套使用IF函数得到判断结果。

IF(expr1,expr2,expr3)函数用于对expr1进行判断,为TRUE时返回expr2,为FALSE返回expr3。

select
if (
    time_a and time_b,
    if(
        time_a > time_b, time_b,time_a
      ),
    if (time_a, time_b, time_a)
   ) actual_time
from table_1160467;

上述查询语句中:内层time_a and time_b的判断结果为 true ,内层两个IF判断后得到的结果分别为time_a,time_b,最终外层IF函数的入参为(true, time_a, time_b),因此返回time_a。

返回结果如下:

      actual_time
------------------------
 2022-01-12 12:23:23+08
(1 row)