去除时间段重复的查询问题~~求助

MattHgh 2012-03-26 10:10:19
查询时怎么去除重复的时间(精确到月)
比如 一个人上班时间记录是
2010-01-01至2010-10-31
2010-08-01至2010-12-31
第2个时间是兼职,这样他就重复了8月-10月,累计查询时他的工作时间就多了几个月
怎么查询才能把重复的时间去除?


create table shijian(
uuid VARCHAR2(50),
rq_b VARCHAR2(30),
rq_e VARCHAR2(30)
)
;

insert into shijian (UUID, RQ_B, RQ_E)
values ('001', '2010-01-01', '2010-10-31');

insert into shijian (UUID, RQ_B, RQ_E)
values ('002', '2010-08-01', '2010-12-31');
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MattHgh 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luiseradl 的回复:]

SQL code

insert into shijian (UUID, RQ_B, RQ_E)
values ('001', '2010-01-01', '2010-10-31');

insert into shijian (UUID, RQ_B, RQ_E)
values ('002', '2010-08-01', '2010-12-31');



表中如何确定,这2条记录是关于同……
[/Quote]


我只是简单举个例子,看下搜索原理
这里就把表里数据看做都属于一个的就行了
yixilan 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luiseradl 的回复:]
SQL code
insert into shijian (UUID, RQ_B, RQ_E)
values ('001', '2010-01-01', '2010-10-31');
insert into shijian (UUID, RQ_B, RQ_E)
values ('002', '2010-08-01', '2010-12-31');
表中如何确定,这2条……
[/Quote]
哈哈,按楼主现在 的逻辑,是无法确定的。
他的表应该不止这么简单。
我心飞翔 2012-03-26
  • 打赏
  • 举报
回复

insert into shijian (UUID, RQ_B, RQ_E)
values ('001', '2010-01-01', '2010-10-31');

insert into shijian (UUID, RQ_B, RQ_E)
values ('002', '2010-08-01', '2010-12-31');


表中如何确定,这2条记录是关于同一个人的呢?
yixilan 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yixilan 的回复:]
先把两条数据,RQ_B与RQ_E之间的月份区间都列出来,比如说:
第一条记录的区间是:2010-01-01, 2010-02-01, 2010-03-01,..., 2010-10-01
第二条记录的区间是:2010-08-01, 2010-09-01, 2010-10-01,..., 2010-12-01
然后用union把两个区间的所有并且不重复的部分取出来,也就是:
从2010-01……
[/Quote]
在二楼的SQL外面,套一个select count(1) from...就可以取出总共工作了几个月
筱伟 2012-03-26
  • 打赏
  • 举报
回复
厉害!
yixilan 2012-03-26
  • 打赏
  • 举报
回复
先把两条数据,RQ_B与RQ_E之间的月份区间都列出来,比如说:
第一条记录的区间是:2010-01-01, 2010-02-01, 2010-03-01,..., 2010-10-01
第二条记录的区间是:2010-08-01, 2010-09-01, 2010-10-01,..., 2010-12-01
然后用union把两个区间的所有并且不重复的部分取出来,也就是:
从2010-01-01 一直到 2010-12-01,这部分的SQL是:
select add_months(to_date(substr(rq_b, 1, 7), 'yyyy-mm'),level-1) duration
from shijian,
(select min(rq_b) rq_min, max(rq_b) rq_max from shijian) minmax
where shijian.rq_b = minmax.rq_min
connect by level <= months_between(to_date(substr(rq_e, 1, 7), 'yyyy-mm'),
to_date(substr(rq_b, 1, 7), 'yyyy-mm'))+1
union
select add_months(to_date(substr(rq_b, 1, 7), 'yyyy-mm'),level-1) duration
from shijian,
(select min(rq_b) rq_min, max(rq_b) rq_max from shijian) minmax
where shijian.rq_b = minmax.rq_max
connect by level <= months_between(to_date(substr(rq_e, 1, 7), 'yyyy-mm'),
to_date(substr(rq_b, 1, 7), 'yyyy-mm'))+1;

结果是:
2010/01/01 00:00:00
2010/02/01 00:00:00
2010/03/01 00:00:00
2010/04/01 00:00:00
2010/05/01 00:00:00
2010/06/01 00:00:00
2010/07/01 00:00:00
2010/08/01 00:00:00
2010/09/01 00:00:00
2010/10/01 00:00:00
2010/11/01 00:00:00
2010/12/01 00:00:00
xpingping 2012-03-26
  • 打赏
  • 举报
回复
如何知道是一个人的记录呢?
是UUID ?
那第二条记录应该是
insert into shijian (UUID, RQ_B, RQ_E)
values (
'001'
, '2010-08-01', '2010-12-31');啊

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧