关于mysql时间区间问题浅析
一、between……and……
SELECT * FROM 表名 WHERE 开始时间字段名 BETWEEN '2018-09-01' AND '2018-09-14';
发现9月14号的数据没有出来,那就证明between……and……是左闭右开,即[a,b),包含a的值,不包含b的值。
将上面代码修改下面的语句即可,将原来的日期加上一天,就行。
select * from 表名 where 字段名 BETWEEN '2018-08-08' and DATE_ADD('2018-09-14',INTERVAL 1 DAY);
这个问题其实代入到数学中很简单。
我测试的时候和同事说没有包含这一天的数据,还争论了半天,其实是因为思维的问题,程序员的思维和正常人的思维是有一定差异的。就像我有时候就会从0开始数东西,到最后发现不对。当然生活中还是要正常,工作中不正常的需求太多了。
二、<和>问题
我的项目用的mybatis,下面就是截取mapper的一部分,其实和上面的between一样的用法
?1 2 3 4 5 6 | <if test= "开始时间字段名 != null and 开始时间字段名 != ''" > AND 开始时间字段名 >= #{前台传的值} </if> <if test= "结束时间字段名!= null and 结束时间字段名!= ''" > AND 结束时间字段名 <= DATE_ADD(#{前台传的值},INTERVAL 1 DAY ) </if> |
三、在java代码中拼接
在代码中拼接,用上面的<和>查询,简单粗暴,只是记录一下实现方法
?1 2 3 4 5 6 | if (StringUtils.isNotEmpty(beginDate)){ params.put( "beginDate" ,beginDate+ " 00:00:00" ); } if (StringUtils.isNotEmpty(endDate)){ params.put( "endDate" ,endDate + " 23:59:59" ); } |
四、转变格式查询
问题描述:db存的格式一般是“yyyy-MM-dd HH:mm:ss”,但是前台查询并不会这样精确,往往会传“yyyy-MM-dd”格式的,像上面的拼接就会显得极及的LOW,在XXXMapper.xml的sql语句中完成会很优雅。
AND DATE_FORMAT(存日期的字段, '%Y-%m-%d') >= #{Entity日期属性}
附:Mysql如何实现指定时间区间的所有日期
Mysql没有递归查询,是如何实现指定日期查询的:mysql.help_topic 这时候就可以使用mysql自带的这个表来实现。(算是取巧的方法,暂时没找到更好的方法)
?1 2 3 | SELECT DATE_FORMAT( date_add(concat( '2019-01-01' ), interval(help_topic_id) DAY ), '%Y-%m-%d' ) DT FROM mysql.help_topic WHERE help_topic_id <= timestampdiff( DAY ,concat( '2019-01-01' ),concat( '2019-12-01' )) |
总结
到此这篇关于mysql时间区间问题的文章就介绍到这了,更多相关mysql时间区间问题内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_20552525/article/details/82704556
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。