一、问题与分析


遇到的问题: 找出xxx到期剩余x天的所有服务


场景限制条件: 数据库表里存的是字符类型的日期格式(yyyy-MM-dd)


分析:当前需要解决的是表里的字段存储日期格式的类型是字符类型,最终想到的是利用STR_TO_DATE()的方法。(最后完美提高了几倍效率)


二、实现过程


一个表数据与表结构,如下图:


微信截图_20220519194225.png


执行sql语句


SELECT * from t_doc_info WHERE 1 = 1 
and (STR_TO_DATE(remind_day,'%Y-%m-%d') 
BETWEEN STR_TO_DATE('2021-12-21','%Y-%m-%d') and STR_TO_DATE('2021-12-21','%Y-%m-%d'))
and is_del = 0


执行结果


微信截图_20220519194235.png


其中, STR_TO_DATE('2021-12-21','%Y-%m-%d') 方法是把字符串类型的时间转化为时间格式,最后利用BETWEEN去求出剩余多少天的所有服务。


BETWEEN就是在这两个数之间的符合条件,没什么好说的。


运行java的代码 (这里只是简单写核心的内容)


public static void main(String[] args) {
    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String startDay = sdf.format(date);
    Calendar ca = Calendar.getInstance();
    ca.add(Calendar.DATE, 7); // 当前计算即将过期是剩余7天内(包括)
    date = ca.getTime();
    String endDay = sdf.format(date);
    System.err.println("即将过期,过期时间在:" + startDay + "和" + endDay + "之间");
}


运行结果 (这里只是简单写核心的内容)


微信截图_20220519194253.png


sql语句转成jdbc写法 (这里只是简单写核心的内容)


import org.springframework.jdbc.core.JdbcTemplate;
public class TestDemoServiceImpl{
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<DocBean> getExpireDocList(String startDay, String endDay,
            String userIdListStr) {
        StringBuffer sb = new StringBuffer();
        sb.append("SELECT * from t_doc_info");
        sb.append(" WHERE 1 = 1");
        if (StringUtils.isNotBlank(userIdListStr)) {
            sb.append(" AND user_id IN(" + userIdListStr + ")");
        if (StringUtils.isNotBlank(startDay) && StringUtils.isNotBlank(endDay)) 
                { // 指定过期时间期间(格式为:yyyy-MM-dd)STR_TO_DATE()字符转为时间类型
            sb.append("AND (STR_TO_DATE(expire_day,'%Y-%m-%d') BETWEEN STR_TO_DATE('" + startDay + "','%Y-%m-%d') and STR_TO_DATE('" + endDay + "','%Y-%m-%d'))");
        sb.append(" AND is_del = 0");
        try {
            return jdbcTemplate.query(sb.toString(),
                    new BeanPropertyRowMapper<DocBean>(DocBean.class));
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
}


扩展 如果要添加条件,指定用户可以这样(例如:指定userId为1001、1002、1003的用户服务情况)


SELECT * from t_doc_info WHERE 1 = 1 
and (STR_TO_DATE(expire_day,'%Y-%m-%d') BETWEEN STR_TO_DATE('2021-12-21','%Y-%m-%d') and STR_TO_DATE('2021-12-21','%Y-%m-%d'))
and is_del = 0
and user_id in ('1001','1002','1003')


文章小尾巴


文章写作、模板、文章小尾巴、参与活动中奖等技巧可参考文章: 《写作“小心思”》


感谢你看到最后,最后再说两点~


①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。

②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~


我是南方者,一个热爱计算机更热爱祖国的南方人。


(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)



Mysql专栏 - Linux底层交互和Raid存储架构
​ 在专栏之前的几篇文章中,我们总结了缓冲池,缓存页,redo log,undo log,以及数据页和数据行在底层是如何进行存储的,后续介绍了表空间,段,区等概念。这一节比较特殊,讲述的是和Linux有关的交互原理,因为多数的mysql都是部署在linux的服务器上面,本节会简单介绍一下linux是如何处理mysql的请求的,以及linux系统会带来哪些问题
MySQL的Binlog日志和Relay Log日志存储的SQL都是一样的吗?底层原理是什么?
MySQL的Binlog日志和Relay Log日志存储的SQL都是一样的吗?底层原理是什么?