最近改bug时,发现了这么个尴尬的bug,查询参数在日期起与日期止(包含临界值)
当时很直接的就想到了between and 语句,数值的 between and的是包含临界值的,所以日期我就用上了。
后来环境的时间带时分秒,奇葩的时间就发生了!
还原场景如下:(表只为说明,所以约束什么都没加)
create table testbetween
(
id number,
cid varchar2(4),
rqq date,
rqz date
);
插入数据:
insert into testbetween (ID, CID, RQQ, RQZ)
values (1, '1', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-08-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (2, '2', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-08-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (3, '3', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-08-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (4, '4', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-07-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (5, '5', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-07-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (9, '9', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-07-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (10, '10', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-07-2012', 'dd-mm-yyyy'));
insert into testbetween (ID, CID, RQQ, RQZ)
values (11, '11', to_date('01-07-2012', 'dd-mm-yyyy'), to_date('01-07-2012', 'dd-mm-yyyy'));
查询语句如下:
--有结果
select * from testbetween where id between 1 and 11;
--有结果
select * from testbetween where cid between 1 and 11;
--有结果
select * from testbetween where to_date('2012-8-1','yyyy-mm-dd') between rqq and rqz;
--有结果
select * from testbetween where to_date('2012-8-1 00:00:00','yyyy-mm-dd hh24:mi:ss') between rqq and rqz;
--无结果
select * from testbetween where to_date('2012-8-1 00:00:01','yyyy-mm-dd hh24:mi:ss') between rqq and rqz;

本文通过一个具体的案例展示了在使用SQL的BetweenAnd语句时遇到的一个关于日期处理的问题。特别是当涉及到日期与时间戳的比较时,即便是看似合理的查询条件也可能因为时间的部分而返回意外的结果。
524

被折叠的 条评论
为什么被折叠?



