sql 时间重复
如何将两张表中的时间段一条条的显示,并且要去掉重复的时间。
表1 : 主键id code 时间
1 500584105 201301
2 500584105 201302
3 500584105 201303
4 500584105 201304
表2 : 主键id code 开始 时间 结束时间
1 500584105 201301 201307
查询的结果是:
500584105 201301
500584105 201302
500584105 201303
500584105 201304
500584105 201305
500584105 201306
500584105 201307
ps:这两张表要通过code关联。如果表2中的时间段包含表1中的时间则只显示一条
------解决思路----------------------
未测试,试一下
SELECT A.CODE,B.时间
(
select (select to_char(add_months(to_date(min(开始时间),''yyyymm),d.rn-1),'yyyymm') from 表2) 时间
from (select rowun rn from dual
connect by ROWNUM<=(SELECT MONTHS_BETWEEN(to_date(min(结束时间),''yyyymm),to_date(min(开始时间),''yyyymm))
FROM 表2)) D
) B,表2 A
WHERE A.开始 时间<=B.时间 AND A.结束时间>=B.时间
union--union本身可以自动去重的
select code,时间 from 表1
------解决思路----------------------
SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret
FROM (SELECT DISTINCT code
FROM tab_1) t1,
tab_2 t2
WHERE t1.code = t2.code
CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0
--tab_1:表一
--tabl_2:表二
--t2.ed:结束时间
--t2.st:开始时间
------解决思路----------------------
引用:Quote: 引用:SQL> select 500584105,201301+level-1 from dual connect by level<= (to_number(201307)-to_number(201301))+1
2 union
3 select 500584105,201301 from dual;
500584105 201301+LEVEL-1
---------- --------------
500584105 201301
500584105 201302
500584105 201303
500584105 201304
500584105 201305
500584105 201306
500584105 201307
已选择7行。
B表应该不只是这一行吧,是不是想得太简单了,呵呵
哈哈,我再加工一下
SQL> select * from t;
ID COL1 COL2
---------- -------------------- --------------------
1 500584105 201301
2 500584105 201302
3 500584105 201303
4 500584105 201304
5 500584106 201302
6 500584106 201303
7 500584106 201304
8 500584106 201305
已选择8行。
SQL> select * from t1;
ID COL1 D1 D2
---------- -------------------- -------------------- ----------------
2 500584106 201301 201304
1 500584105 201301 201307
SQL> select distinct col1, to_char(d1 + level - 1)/*, d1, d2*/
2 from t1
3 connect by level <= (to_number(d2) - to_number(d1)) + 1
4 union
5 select col1,col2 from t;
COL1 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/
-------------------- ----------------------------------------
500584105 201301
500584105 201302
500584105 201303
500584105 201304
500584105 201305
500584105 201306
500584105 201307
500584106 201301
500584106 201302
500584106 201303
500584106 201304
COL1 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/
-------------------- ----------------------------------------
500584106 201305
已选择12行。
------解决思路----------------------
引用:Quote: 引用:SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret
FROM (SELECT DISTINCT code
FROM tab_1) t1,
tab_2 t2
WHERE t1.code = t2.code
CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0
--tab_1:表一
--tabl_2:表二
--t2.ed:结束时间
--t2.st:开始时间
大神,能否解释下,这个CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0;尤其是后面 - LEVEL + 1 是怎么个用法的。没太明白,多谢。
http://www.cnblogs.com/lettoo/archive/2010/08/03/1791239.html
这个介绍CONNECT BY的,里面有3个例子,你看看有介绍LEVEL,CONNECT_BY_ISLEAF等等介绍的