Oracle 从一个时间段(两个字段)中提取实际天数

本文介绍了一种在数据库中统计用户连续登录天数的方法,通过创建临时表来生成日期序列,然后与用户登录记录进行关联,以计算每个用户的实际在线天数。

需求: 表中有一个用户上线时间 和 用户下线时间(用户可能连续好几天不退出,也可能用户一天登录多次) ,与此根据这两个时间来统计用户实际在线天数

表结构:

 

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

 

 

这属于骚断腿操作,  效率不行, 仅仅支持数据量不大时,这样做.

如有更好的方式,还请麻烦告诉我一下.  谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值