0%

按时间区间查询时要注意的地方

在开发中肯定会遇到一些按时间区间进行查询的地方,这时需要注意对边界值的处理。本文就介绍下按时间区间进行查询的时候,需要注意的地方。

比如现在要查询订单表中下单时间在2015-11-10 10:00:002015-11-10 20:00:00。如果sql语句写成以下这样(以下为伪代码,真实代码中时间参数可能不是这样的):

1
select * from Order where create_date >= '2015-11-10 10:00:00' and create_date <= '2015-11-10 20:00:00';

这种闭合区间会导致重复查询。比如下在要查询下单时间在2015-11-10 20:00:002015-11-10 22:00:00的订单,sql代码会成为:

1
select * from Order where create_date >= '2015-11-10 20:00:00' and create_date <= '2015-11-10 22:00:00';

这样会导致下单时间为2015-11-10 20:00:00的订单重复查询。无论是出报表还是要进行些批处理之类的操作,都会把这个订单处理两次。

同样如果的都使用开区间进行查询,把sql语句写成:

1
select * from Order where create_date > '2015-11-10 10:00:00' and create_date < '2015-11-10 20:00:00';

这样就会导致在边界的记录查询不到。

所以我们要使用一个半闭半开区间,如:

1
select * from Order where create_date >= '2015-11-10 10:00:00' and create_date < '2015-11-10 20:00:00';

这样就可以做到即不重复查询,也不会漏查。我建议是前会使用>=后面使用<,也就是前面的时间包含后面的时间不包含。

需要注意的是,不要使用between and,因为在不同的数据库中对于边界处理的方法可能不同,有的包含,有的不包含。也可能会造成重复查询或漏查。