我们在开发过程会经常遇到日期查询这样的需求。
你要是不拿一个纸画一画,这个很容易把人搞糊涂的。
下面是我画的图。
比如我想要2月份的所有数据,那么我就要考虑到图片中的四种情况:
1、数据的起始日期在规定起始日期之前,并且数据的终止日期在规定终止日期之前。
2、数据的起始日期在规定起始日期之前,并且数据的终止日期在规定终止日期之后。
3、数据的起始日期在规定起始日期之后,并且数据的终止日期在规定终止日期之前。
4、数据的起始日期在规定起始日期之后,并且数据的终止日期在规定终止日期之后。
看着像绕口令不,要不吗,不画画真就把你糊涂。
起始仔细观察1、2两步起始可以合并在一起:
1、数据的起始日期在规定起始日期之前,并且数据的终止日期在规定起始日期之前。(和上面1、2对比,结合着图来看)
下面是2段SQL代码,对上面说的进行转化。
select * from AdvRule where
(
(startDate <= DATE('2014-04-01') and endDate >= DATE('2014-04-30'))
or
(startDate <= DATE('2014-04-01') and endDate <= DATE('2014-04-30') and endDate >= DATE('2014-04-01'))
or
(startDate >= DATE('2014-04-01') and startDate <= DATE('2014-04-30') and endDate >= DATE('2014-04-30'))
or
(startDate >= DATE('2014-04-01') and endDate <= DATE('2014-04-30'));
)
select * from AdvRule where
(
(startdate <= DATE('2014-04-01') and enddate >= DATE('2014-04-01'))
OR
(startdate <= DATE('2014-04-30') and enddate >= DATE('2014-04-30'))
OR
(startdate >= DATE('2014-04-01') and enddate <= DATE('2014-04-30'))
)
说到SQL判断日期前后,如果你正迷糊着大于小于和之前之后,不妨根据箭头方向,箭头指向当前时间点左面(<)就是之前,指向当前时间点右面(>)就是之后,我感觉这样很好记。
以上在查询上回有一个问题,如果一旦我录入的止期在起期之前,那么这个查询语句也会查出来,但是这中录入方式也是不对的,所以我们可以不用考虑。