Oracle中查询起止日期均在过去24小时的记录及SQL正确性判断
首先得明确核心需求:我们要筛选的是**START_date和STOP_date两个字段的时间,都落在“过去24小时”区间内**——也就是从当前时间往前推24小时(SYSDATE - INTERVAL '1' DAY,等价于SYSDATE -1)到当前时间(SYSDATE)之间的范围。
现在逐一拆解你给出的两条SQL:
第一条SQL:
SELECT * FROM table1 WHERE START_date <= SYSDATE -1 AND STOP_date >= SYSDATE -1
这个条件的逻辑是:START_date早于24小时前,且STOP_date晚于24小时前。它筛选的是时间段跨越了24小时前这个时间点的记录,比如一条记录的START_date是3天前,STOP_date是10小时前,会被这条SQL选中,但它的START_date显然不在过去24小时内,完全不符合“起止日期均处于过去24小时内”的要求。
第二条SQL:
SELECT * FROM table1 WHERE START_date >= SYSDATE -1 AND STOP_date <= SYSDATE -1
这个条件存在逻辑矛盾:要求START_date晚于24小时前,同时STOP_date早于24小时前,这意味着START_date >= STOP_date,只有当START_date和STOP_date完全相等且恰好是24小时前的时间点时,才会有符合条件的记录,显然不是你想要的结果,也不符合需求。
正确的SQL写法
如果要准确筛选起止日期都在过去24小时内的记录,推荐使用以下写法:
SELECT * FROM table1 WHERE START_date BETWEEN SYSDATE - INTERVAL '1' DAY AND SYSDATE AND STOP_date BETWEEN SYSDATE - INTERVAL '1' DAY AND SYSDATE;
或者展开写(效果完全一致,可读性稍弱):
SELECT * FROM table1 WHERE START_date >= SYSDATE - 1 AND START_date <= SYSDATE AND STOP_date >= SYSDATE - 1 AND STOP_date <= SYSDATE;
这里用INTERVAL '1' DAY比直接写-1更具语义性,两者在Oracle中是等价的。
另外补充一点:如果你的START_date和STOP_date是TIMESTAMP类型(带时分秒),SYSDATE返回的DATE类型会被Oracle自动隐式转换,不会有问题;如果是纯日期字段(不带时分秒),可以根据业务需求调整边界条件(比如是否包含24小时前的当天零点)。
内容的提问来源于stack exchange,提问作者user747291

