3,491
社区成员
发帖
与我相关
我的任务
分享
-- try it ..
SQL> select /*+ ordered use_hash(a b) */
2 b.product_id,
3 b.product_status,
4 b.member_id,
5 a.member_status,
6 greatest(a.start_date,b.start_date) as start_date,
7 least(a.end_date,b.end_date) as end_date
8 from tab_member a,
9 tab_product b
10 where a.member_id = b.member_id
11 and (a.start_date between b.start_date and b.end_date
12 or b.start_date between a.start_date and a.end_date
13 or a.end_date between b.start_date and b.end_date
14 or b.end_date between a.start_date and a.end_date)
15 order by 1,3,5,6
16 ;
PRODUCT_ID PRODUCT_STATUS MEMBER_ID MEMBER_STATUS START_DATE END_DATE
-------------------- -------------------- -------------------- -------------------- ----------- -----------
001 online A enabled 2010-3-4 2010-3-5
001 online A diabled 2010-3-6 2010-3-8
001 online A tbd 2010-3-9 2010-3-21
001 wait A tbd 2010-3-22 2010-3-26
001 enabled A tbd 2010-3-26 2010-4-11
001 online A tbd 2010-4-12 2010-4-15
001 online A delete 2010-4-16 2010-6-5
001 online A delete 2010-6-6 2010-6-7
001 online A enabled 2010-6-8 3000-12-31
002 delete B diabled 2010-3-2 2010-3-8
002 delete B enabled 2010-3-9 2010-3-19
002 online B enabled 2010-3-20 2010-4-1
002 online B enabled 2010-4-11 2010-4-12
002 delete B enabled 2010-4-13 2010-4-30
002 delete B tbd 2010-5-1 2010-6-3
002 enabled B tbd 2010-6-4 3000-12-31
002 enabled B unknown 2010-6-8 2010-4-10
002 online B unknown 2010-6-8 2010-4-10
18 rows selected