【HIVE/MySQL】 sql中 between * and * 在不同数据类型下的差异

背景

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容