Mysql中查询年月区间,年和月是两个字段

最近项目中有个业务是查询年月区间的,年和月是两个字段。

(1)表结构

其中statistic_year是int类型的,statistic_month是varchar类型的

图片

(2)前端传参

图片

约定固定4个值。意思是,查询日期区间为2019年01月~2020年09月的数据(可能会有其他参数限定)

(3)后端接收

List<Integer> year;
List<String> month;

(4)解决方法

百度了亿下,虽然没找到正好合适的代码,但看到网上大部分思路都是拼接,以下是尝试的方法。

cast(value as type);
convert(value as type);
  1. 年+月
select  
    statistic_hour as hour,
    SUM(case when jcflag=0 then COALESCE(cnt,0) else 0 end) as inCnt,
    SUM(case when jcflag=1 then COALESCE(cnt,0) else 0 end) as outCnt
		from gd_rail_station_flow  
		where concat(cast(statistic_year as VARCHAR(10)),'-',statistic_month) BETWEEN '2019-08' and '2020-12'
		GROUP BY statistic_hour ORDER BY statistic_hour

先用cast函数将statistic_year转成varchar(10),这里需要带上字符的长度,不然会报错。然后再用concat将各个字符连接起来。就成了2020-09形式。后端传的时候需要拼接下year和month

结果:

图片

  1. 年+月+‘01 00:00.000’
select    
    statistic_hour as hour,
    SUM(case when jcflag=0 then COALESCE(cnt,0) else 0 end) as inCnt,
    SUM(case when jcflag=1 then COALESCE(cnt,0) else 0 end) as outCnt
		from gd_rail_station_flow   
    where CONVERT(concat(cast(statistic_year as VARCHAR(10)),'-',statistic_month,'-01 00:00:00.000'),datetime) BETWEEN '2019-08-01 00:00:00' and '2020-01-01 00:00:00'
    GROUP BY statistic_hour ORDER BY statistic_hour

如果是年+月+‘01 00:00.000’的形式,就是需要转成datetime类型,形如’2020-12-01 00:00:00’。between和and里的也需要通过后端拼接转换成datetime类型。

结果:

图片

随后又比较了两种方法,所用的查询时间差不多。

目前数据量是166w多条。

图片

但如果是大数据量的话,查询效率应该不高…后续优化吧。

╮(╯▽╰)╭

(5)测试

最后通过前后端测试一下吧,以防出现bug。

图片

比如查询数据库中这几条记录:

2020-10~2021-07,就前三条数据。

图片

前端传参:

图片

后端部分:

图片

结果:

图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄衫啊

三克油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值