有关日期查询的思考

我们在开发过程会经常遇到日期查询这样的需求。

你要是不拿一个纸画一画,这个很容易把人搞糊涂的。

下面是我画的图。


比如我想要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判断日期前后,如果你正迷糊着大于小于和之前之后,不妨根据箭头方向,箭头指向当前时间点左面(<)就是之前,指向当前时间点右面(>)就是之后,我感觉这样很好记。

以上在查询上回有一个问题,如果一旦我录入的止期起期之前,那么这个查询语句也会查出来,但是这中录入方式也是不对的,所以我们可以不用考虑。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值