【Java】【MySQL】数据库存储的日期是字符类型,查询指定日期时间区间是用数据库的方法STR_TO_DATE().

545 阅读2分钟

一、问题与分析

遇到的问题:找出xxx到期剩余x天的所有服务
场景限制条件:数据库表里存的是字符类型的日期格式(yyyy-MM-dd)
分析:当前需要解决的是表里的字段存储日期格式的类型是字符类型,最终想到的是利用STR_TO_DATE()的方法。(最后完美提高了几倍效率)

二、实现过程

一个表数据与表结构,如下图: image.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

执行结果 image.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 + "之间");
}

运行结果(这里只是简单写核心的内容) image.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')

文章小尾巴

文章写作、模板、文章小尾巴、参与活动中奖等技巧可参考文章:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

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