逻辑操作符
功能描述
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)