背景
hive/mysql下使用sql中的between * and * 在不同数据类型下竟然不一样。
1、int类型、float类型、string类型是包含头尾的。
2、timestamp包含头,但不包含尾!!!此外,当between a and a 时, 是不包含a的。
具体原因,有待进一步调研。
避坑办法
使用大于等于和小于等于替代between * and * ,避免这个问题。
验证过程
1、int、float类型数据——包含头尾
select
7 as time
, case when 7 between 7 and 8 then "1" else "0" end as judge
union all
select
8 as time
, case when 8 between 7 and 8 then "1" else "0" end as judge
图片.png
select
7.0 as time
, case when 7.0 between 7.0 and 8.0 then "1" else "0" end as judge
union all
select
8.0 as time
, case when 8.0 between 7.0 and 8.0 then "1" else "0" end as judge
图片.png
2、string类型——包含头尾
select
to_date(now()) as time
, case when to_date(now()) between "2020-11-11" and "2020-11-12" then "1" else "0" end as judge
union all
select
to_date(date_add(now(),1)) as time
, case when to_date(date_add(now(),1)) between "2020-11-11" and "2020-11-12" then "1" else "0" end as judge
图片.png
3、timestamp类型——包含头,但不包含结尾
select
now() as time
, case when now() between "2020-11-11" and "2020-11-12" then "1" else "0" end as judge
union all
select
date_add(now(),1) as time
, case when date_add(now(),1) between "2020-11-11" and "2020-11-12" then "1" else "0" end as judge
图片.png
网友评论