一、问题与分析
遇到的问题:
找出xxx到期剩余x天的所有服务
场景限制条件:
数据库表里存的是字符类型的日期格式(yyyy-MM-dd)
分析:当前需要解决的是表里的字段存储日期格式的类型是字符类型,最终想到的是利用STR_TO_DATE()的方法。(最后完美提高了几倍效率)
二、实现过程
一个表数据与表结构,如下图:
执行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
执行结果
其中,
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 + "之间");
}
运行结果
(这里只是简单写核心的内容)
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')
文章小尾巴
文章写作、模板、文章小尾巴、参与活动中奖等技巧可参考文章:
《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)
在专栏之前的几篇文章中,我们总结了缓冲池,缓存页,redo log,undo log,以及数据页和数据行在底层是如何进行存储的,后续介绍了表空间,段,区等概念。这一节比较特殊,讲述的是和Linux有关的交互原理,因为多数的mysql都是部署在linux的服务器上面,本节会简单介绍一下linux是如何处理mysql的请求的,以及linux系统会带来哪些问题