MySql数据库查询时,时间格式问题导致查询不到结果——畅购商城秒杀商品查询

1.错误场景:

秒杀页面商品列表页展示商品数据,需要查询数据库:根据秒杀时间区间使用通用Mapper的条件查询方式查询。代码如下,此处只展示条件查询部分代码:

			// 1.构建条件查询
            Example example = new Example(SeckillGoods.class);
            Example.Criteria criteria = example.createCriteria();

            // 1) 状态为已审核 status:1
            criteria.andEqualTo("status", "1");
            // 2) 库存大于0 stock_count>0
            criteria.andGreaterThan("stockCount", 0);
            // 3) 秒杀开始时间大于等于秒杀区间开始时间 start_time>=秒杀区间开始时间
            criteria.andGreaterThanOrEqualTo("startTime", dateMenu);
            // 4) 秒杀结束时间小于秒杀区间开始时间加2小时 end_time<dateMenu+2
            criteria.andLessThan("endTime", DateUtil.addDateHour(dateMenu, 2));

            // 排除已经加入了Redis的商品,不排除会一直重复添加
            // 先获取当前命名空间下的所有key即已经存入的商品id
            Set keys = redisTemplate.boundHashOps(timeNameSpace).keys();
            if (keys != null && keys.size()>0){
                // 排除已经存入的商品
                criteria.andNotIn("id", keys);
            }

            // 2.执行条件查询
            List<SeckillGoods> seckillGoods = seckillGoodsMapper.selectByExample(example);

参数dateMenu:秒杀时间区间的起始时间;例如:秒杀时间为2020-06-20 10:00:00——2020-06-20 12:00:00,此处dateMenu就是2020-06-20 10:00:00;但此处并不是我们常用的这种时间格式,而是:Sat Jun 20 10:00:00 CST 2020这种格式,这也是导致查询失败的原因。这是重点。

2.解决方案

			// 1.构建条件查询
            Example example = new Example(SeckillGoods.class);
            Example.Criteria criteria = example.createCriteria();
            
            
	***// 此处对时间格式进行统一处理,问题得到解决***
	
	
            String startTime = DateUtil.data2str(dateMenu, "yyyy-MM-dd HH:mm:ss");
            String endTime = DateUtil.data2str(DateUtil.addDateHour(dateMenu, 2), "yyyy-MM-dd HH:mm:ss");

            // 1) 状态为已审核 status:1
            criteria.andEqualTo("status", "1");
            // 2) 库存大于0 stock_count>0
            criteria.andGreaterThan("stockCount", 0);
            // 3) 秒杀开始时间大于等于秒杀区间开始时间 start_time>=秒杀区间开始时间
            criteria.andGreaterThanOrEqualTo("startTime", startTime);
            // 4) 秒杀结束时间小于秒杀区间开始时间加2小时 end_time<dateMenu+2
            criteria.andLessThan("endTime", endTime);

            // 排除已经加入了Redis的商品,不排除会一直重复添加
            // 先获取当前命名空间下的所有key即已经存入的商品id
            Set keys = redisTemplate.boundHashOps(timeNameSpace).keys();
            if (keys != null && keys.size()>0){
                // 排除已经存入的商品
                criteria.andNotIn("id", keys);
            }

            // 2.执行条件查询
            List<SeckillGoods> seckillGoods = seckillGoodsMapper.selectByExample(example);

3.总结

数据库的数据一般使用yyyy-MM-dd HH:mm:ss格式,不管使用何种连接符,但是代码中的时间格式默认是Sat Jun 20 10:00:00 CST 2020这种格式,所以我们在查询数据库时,要代码中的时间格式和数据库时间格式统一。

但是视频中老师采用我第一次使用的方式并没有发生问题,不知道为什么,配置文件都是一样的。
萌新记录自己发生的问题,不喜绕道,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值