需求: 表中有一个用户上线时间 和 用户下线时间(用户可能连续好几天不退出,也可能用户一天登录多次) ,与此根据这两个时间来统计用户实际在线天数
表结构:
create table sys_user_login_log (
id varchar2(36) primary key ,
create_by varchar2(36) ,
login_date date ,
exit_date date
)
表数据:
insert into sys_user_login_log (ID, CREATE_BY, LOGIN_DATE, EXIT_DATE)
values ('123456', '123', to_date('01-01-2019 01:02:02', 'dd-mm-yyyy hh24:mi:ss'), to_date('02-01-2019 11:02:02', 'dd-mm-yyyy hh24:mi:ss'));
insert into sys_user_login_log (ID, CREATE_BY, LOGIN_DATE, EXIT_DATE)
values ('1234567', '123', to_date('03-01-2019 11:02:02', 'dd-mm-yyyy hh24:mi:ss'), to_date('03-01-2019 15:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into sys_user_login_log (ID, CREATE_BY, LOGIN_DATE, EXIT_DATE)
values ('1234568', '123', to_date('05-01-2019 01:02:02', 'dd-mm-yyyy hh24:mi:ss'), to_date('08-01-2019 01:04:02', 'dd-mm-yyyy hh24:mi:ss'));
insert into sys_user_login_log (ID, CREATE_BY, LOGIN_DATE, EXIT_DATE)
values ('1234569', '123', to_date('10-01-2019 01:04:02', 'dd-mm-yyyy hh24:mi:ss'), to_date('08-01-2019 17:04:02', 'dd-mm-yyyy hh24:mi:ss'));
表中的数据是夸天的,实际统计天数时,很是不便.
只能用一个临时表来先构建实际间隔日期, 然后再来关联数据,
select rtab.create_by , count(distinct tab.days) as days from (
SELECT TO_DATE('2019-01-01', 'yyyy-MM-dd') + (ROWNUM - 1) days
FROM DUAL
CONNECT BY ROWNUM <= (TO_DATE('2019-01-10', 'yyyy-MM-dd') - TO_DATE('2019-01-01', 'yyyy-MM-dd') + 1)
) tab
join (
select log.CREATE_BY ,log.login_date ,log.EXIT_DATE from sys_user_login_log log
) rtab on tab.days between trunc(rtab.login_date) and trunc(rtab.exit_date)
group by rtab.create_by
这属于骚断腿操作, 效率不行, 仅仅支持数据量不大时,这样做.
如有更好的方式,还请麻烦告诉我一下. 谢谢