有一个oracle表 t,有3列,第一列为标题,第二三列为日期。内容如下:
标题 开始日期 结束日期
title start end
A 2011/1/1 2011/1/5
B 2012/2/1 2012/2/5
C 2013/3/1 2013/3/7
随着公司业务的增长,表t会有更多的记录。
如何写一个视图,查询出的结果为如下:
title day
A 2011/1/1
A 2011/1/2
A 2011/1/3
A 2011/1/4
A 2011/1/5
B 2012/2/1
B 2012/2/2
B 2012/2/3
B 2012/2/4
B 2012/2/5
C 2013/3/1
C 2013/3/2
C 2013/3/3
C 2013/3/4
C 2013/3/5
C 2013/3/6
C 2013/3/7
谢谢oracle高手大神~
create or replace view myview as
select?……
CREATE TABLE t ( title VARCHAR2 (10), startdate DATE, enddate DATE );
INSERT INTO t VALUES ('A', DATE '2011-01-01', DATE '2011-01-05');
INSERT INTO t VALUES ('B', DATE '2012-02-01', DATE '2012-02-05');
INSERT INTO t VALUES ('C', DATE '2013-03-01', DATE '2013-03-07');
SELECT title, startdate + LEVEL - 1 AS fday FROM t GROUP BY title, startdate, LEVEL CONNECT BY startdate + LEVEL - 1 <= enddate ORDER BY startdate;
非常感谢你的回答。我验证了下结果是正确的。
可是还有个问题,就是startdate和enddate日期间隔天数较多时候,语句执行的很慢很慢,好几分钟也出不来结果。为什么呢,盼告知。
INSERT INTO t VALUES ('A', DATE '2013-01-05', DATE '2013-03-15');
INSERT INTO t VALUES ('B', DATE '2012-04-22', DATE '2012-06-10');
INSERT INTO t VALUES ('C', DATE '2012-02-12', DATE '2012-03-31');
INSERT INTO t VALUES ('D', DATE '2011-05-08', DATE '2011-06-20');
INSERT INTO t VALUES ('E', DATE '2011-02-27', DATE '2011-04-20');
如果表里的数据如以上所示,执行可慢了,出不了结果。为什么呢?谢谢。
@︶ㄣ第二名:
这样的情况下建议考虑下面的方案:
一、修改表结构(现在的表结构数据量大的情况下,要用select查询出来性能很难解决)
二、利用存储过程(通过中间表来实现)
我建议你建一个表,这个表只有日期,从2000-1-1到2020-12-31,表名tm,字段dt
select t.title,tm.dt from t left join tm on tm.dt between t.start and t.[end]
ps:我这是sqlserver,测试没问题,ssms显示运行时间为0秒
建议不要在SQL处理这种数据,会出翔。完全可以交给表现层去做