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

有一个表记录一个网点所有快递到达和离开的时间,如果离开时间不等于到达时间则代表这个运单在这个网点有停留,如何统计出在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;  -- 确保离开时间不为空

解释:

  1. leave_time != arr_time:确保运单在网点有停留(停留时间大于0)
  2. arr_time <= '2018-03-01 15:00:00':运单到达时间不晚于查询时间段的结束时间
  3. leave_time >= '2018-03-01 13:00:00':运单离开时间不早于查询时间段的开始时间
  4. 同时检查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)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值