有一个表记录一个网点所有快递到达和离开的时间,如果离开时间不等于到达时间则代表这个运单在这个网点有停留,如何统计出在2018-03-01 13:00到2018-03-01 15:00之间在该网点有停留的运单数

create table tab9 (
waybillno number(4),
arr_time date,
leave_time date
);
insert into tab9 (waybillno, arr_time, leave_time)
values (1, to_date('2018-03-01 12:40:10','yyyy-mm-dd hh24:mi:ss'), to_date('2018-03-01 13:50:10','yyyy-mm-dd hh24:mi:ss'));
insert into tab9 (waybillno, arr_time, leave_time)
values (2, to_date('2018-03-01 11:29:45','yyyy-mm-dd hh24:mi:ss'), to_date('2018-03-01 12:40:18','yyyy-mm-dd hh24:mi:ss'));
insert into tab9 (waybillno, arr_time, leave_time)
values (3, to_date('2018-03-01 14:35:10','yyyy-mm-dd hh24:mi:ss'), to_date('2018-03-01 16:00:00','yyyy-mm-dd hh24:mi:ss'));
commit;
要统计在2018-03-01 13:00到2018-03-01 15:00之间在该网点有停留的运单数,需要找出那些在该时间段内至少有一部分时间停留在网点的运单(即到达时间早于或等于结束时间,且离开时间晚于或等于开始时间,并且离开时间不等于到达时间)。
以下是SQL查询语句:
SELECT COUNT(DISTINCT waybillno) AS stay_count
FROM tab9
WHERE leave_time != arr_time -- 确保有停留
AND arr_time <= TO_DATE('2018-03-01 15:00:00', 'yyyy-mm-dd hh24:mi:ss') -- 到达时间不晚于结束时间
AND leave_time >= TO_DATE('2018-03-01 13:00:00', 'yyyy-mm-dd hh24:mi:ss') -- 离开时间不早于开始时间
AND arr_time IS NOT NULL -- 确保到达时间不为空
AND leave_time IS NOT NULL; -- 确保离开时间不为空
解释:
leave_time != arr_time:确保运单在网点有停留(停留时间大于0)arr_time <= '2018-03-01 15:00:00':运单到达时间不晚于查询时间段的结束时间leave_time >= '2018-03-01 13:00:00':运单离开时间不早于查询时间段的开始时间- 同时检查NULL值以避免计算错误
对于您提供的测试数据:
- 运单1:到达时间12:40,离开时间13:50 - 在时间段内(13:00-13:50)有停留
- 运单2:到达时间11:29,离开时间12:40 - 完全不在时间段内
- 运单3:到达时间14:35,离开时间16:00 - 在时间段内(14:35-15:00)有停留
因此查询结果应该为2(运单1和运单3)。


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



