java+mysql年月字段分开范围查询且规避druid的防火墙wall

java+mysql年月字段分开范围查询且规避druid的防火墙wall

背景

前人大佬的DDL中,年月字段是分开存储的,用的是int类型。类似的ddl如下

create table demo(
id bigint unsigned primary_key,
state varchat(10) comment '状态',
year int comment '年',
month int comment '月'
)

需求

对年月字段做范围查询,比如查询2020-11到2021-02的数据

实现一

开始看到这个需求没过脑子,写的sql如下:

year > 2020 and month > 11 and year < 2021 and month < 2

事后QA也没测到这个case,然后就顺利的上线了。
直到用户报出来一看代码才知道当时的自己是多么的愚蠢…

实现二

痛定思痛后,思路是有的,然后百度了一番mysql高级语法,一顿啪啪啪很快写出了下面的代码:

select * 
from demo
where 
AND concat(CAST(accrual_year AS char(4)), '-', CAST(lpad(accrual_month, 2, 0) AS char(2))) BETWEEN '2020-11' AND '2021-02'

然后很自信的没有本地测试就发布到了测试环境,结果意外翻车了。还是扶不去来的车…
在这里插入图片描述
错误提示:
** java.sql.SQLException: sql injection violation, part alway false condition not allow**

其实这个异常挺迷惑的,sql直接执行是没问题的,但druid就是给报错了

实现三

没有思路,又不想只因为这个就关掉druid的wall,于是找到了隔壁桌大佬。大佬给出了下面的思路

select * 
from demo
where (year * 100 + month) > 202011
and (year * 100 + month) < 202102

单边查询时自己定义一个最大最小时间就行了,比如0和999912

** p.s. 100这个权重其实用2也行,因为无论如何都超过了月份的最大值12**


以上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值