因爲對oracle函數部熟,所以提供一個思路。 選擇條件 LOGIN_TIME=2004-6-11 or LOGOUT_TIME=2004-6-11 or (LOGOUT_TIME>2004-6-12 00:00:00 and LOGIN_TIME<2004-6-11 00:00:00) 然後,sum時分4种情況 LOGIN_TIME=LOGOUT_TIME時,就用DURING_TIME LOGIN_TIME=2004-6-11 LOGOUT_TIME!=2004-6-11,求 2004-6-11 23:59:59和LOGIN_TIME差值 LOGOUT_TIME=2004-6-11 LOGIN_TIME!=2004-6-11 求 2004-6-11 00:00:00和LOGOUT_TIME差值 第4种 == 24*60*60
/************************************************************************************** 这个表要实现我的要求是有点困难。比如:我要统计6月11号这天的登录时长,涉及到的记录是: AGENT_ID LOGIN_TIME LOGOUT_TIME DURING_TIME 118 2004-6-11 16:59 2004-6-11 21:25 15992 --因为字段中没有秒,所以这里不可能是15992 118 2004-6-11 21:50 2004-6-12 9:19 41363 我需要的数据是15992+7783?(2004-6-11 21:50:17到2004-6-11 23:59:59之间的数据) ***************************************************************************************/ select sum(sum_time) all_time from ( --登陆登出如期在同一天的 select sum(a.during_time) sum_time from tablea a where 1=1 and a.agent_id=118 and to_char(a.login_time,'yyyy-mm-dd')=to_char(a.logout_time,'yyyy-mm-dd') and a.login_time=你输入的时间参数 union --两个时间不在同一天的时候. select sum((to_date(to_char(b.login_time,'yyyy-mm-dd')||' 23:59' ,'yyyy-mm-dd hh24:mi')-b.login_time)*24*60*60) sum_time from tablea b where 1=1 and b.agent_id=118 and to_char(b.login_time,'yyyy-mm-dd') < to_char(b.logout_time,'yyyy-mm-dd') and b.login_time=你输入的时间参数 ) --以上没有对跨越两天的进行处理. 即;登陆时间 2004-06-17 12:00 登出时间 2004-06-19 14:00
select sum(登录时长) from table where 工号='118' and 登录时间>=to_date('6月2号') and 登录时间<=to_date('6月11号')select sum(登录时长) from table where 工号='118' and 登录时间>=to_date('6月2号') and 登录时间<=to_date('6月2号')
他的时间是跨度的,到底需要怎么统计,还需要他说明,是不是说,6/2在登陆时间和退出时间之间,都算呢?还是什么。他都没有说清楚。
AGENT_ID LOGIN_TIME LOGOUT_TIME DURING_TIME
118 2004-06-01 17:24:15 2004-06-02 11:30:08 65153
118 2004-06-02 12:36:59 2004-06-02 14:15:33 5914
118 2004-06-02 14:17:38 2004-06-03 08:42:19 66281
118 2004-06-03 19:08:45 2004-06-04 06:55:18 42393
118 2004-06-06 08:12:50 2004-06-06 20:38:10 44720
118 2004-06-06 15:06:13 2004-06-06 20:38:10 19917
118 2004-06-07 19:31:33 2004-06-08 08:04:20 45167
118 2004-06-07 22:55:22 2004-06-08 08:04:20 32938
118 2004-06-08 08:04:38 2004-06-09 12:08:40 101042
118 2004-06-10 15:25:47 2004-06-10 22:49:31 26624
118 2004-06-11 16:59:09 2004-06-11 21:25:41 15992
118 2004-06-11 21:50:17 2004-06-12 09:19:40 41363 这个表要实现我的要求是有点困难。比如:我要统计6月11号这天的登录时长,涉及到的记录是:
118 2004-6-11 16:59 2004-6-11 21:25 15992
118 2004-6-11 21:50 2004-6-12 9:19 41363
我需要的数据是15992+7783?(2004-6-11 21:50:17到2004-6-11 23:59:59之间的数据)
選擇條件 LOGIN_TIME=2004-6-11 or LOGOUT_TIME=2004-6-11 or (LOGOUT_TIME>2004-6-12 00:00:00 and LOGIN_TIME<2004-6-11 00:00:00)
然後,sum時分4种情況
LOGIN_TIME=LOGOUT_TIME時,就用DURING_TIME
LOGIN_TIME=2004-6-11 LOGOUT_TIME!=2004-6-11,求 2004-6-11 23:59:59和LOGIN_TIME差值
LOGOUT_TIME=2004-6-11 LOGIN_TIME!=2004-6-11 求 2004-6-11 00:00:00和LOGOUT_TIME差值
第4种 == 24*60*60
这个表要实现我的要求是有点困难。比如:我要统计6月11号这天的登录时长,涉及到的记录是:
AGENT_ID LOGIN_TIME LOGOUT_TIME DURING_TIME
118 2004-6-11 16:59 2004-6-11 21:25 15992 --因为字段中没有秒,所以这里不可能是15992
118 2004-6-11 21:50 2004-6-12 9:19 41363
我需要的数据是15992+7783?(2004-6-11 21:50:17到2004-6-11 23:59:59之间的数据)
***************************************************************************************/
select
sum(sum_time) all_time
from
(
--登陆登出如期在同一天的
select
sum(a.during_time) sum_time
from
tablea a
where
1=1
and a.agent_id=118
and to_char(a.login_time,'yyyy-mm-dd')=to_char(a.logout_time,'yyyy-mm-dd')
and a.login_time=你输入的时间参数
union
--两个时间不在同一天的时候.
select
sum((to_date(to_char(b.login_time,'yyyy-mm-dd')||' 23:59' ,'yyyy-mm-dd hh24:mi')-b.login_time)*24*60*60) sum_time
from
tablea b
where
1=1
and b.agent_id=118
and to_char(b.login_time,'yyyy-mm-dd') < to_char(b.logout_time,'yyyy-mm-dd')
and b.login_time=你输入的时间参数
)
--以上没有对跨越两天的进行处理. 即;登陆时间 2004-06-17 12:00 登出时间 2004-06-19 14:00
where 工号='118'
and 登录时间>=to_date('6月2号')
and 登录时间<=to_date('6月11号')select sum(登录时长) from table
where 工号='118'
and 登录时间>=to_date('6月2号')
and 登录时间<=to_date('6月2号')