在表中填写日期范围内的缺失日期

时间:2016-04-21 03:17:40

标签: sql oracle date

table A
no  date        count
1   20160401    1
1   20160403    4
2   20160407    3
result
no  date        count
1   20160401    1
1   20160402    0
1   20160403    4
1   20160404    0
.
.
.
2   20160405    0
2   20160406    0
2   20160407    3
.
.
.

我正在使用Oracle,我想编写一个查询,根据表A返回范围内每个日期的行。

Oracle中是否有某些功能可以帮助我?

3 个答案:

答案 0 :(得分:1)

您可以使用SEQUENCES

首先创建一个序列

 Create Sequence seq_name start with 20160401 max n;

其中n是您想要显示的最大值。

然后使用sql

 select seq_name.next,case when seq_name.next = date then count else 0 end from tableA;   

注意: - 最好不要使用日期,计算为列名。

答案 1 :(得分:0)

这不是特定于oracle的答案,您需要自己将其翻译为oracle。

创建一个interval表,包含0到999之间的所有整数。如下所示:

linkParams.put("frame", new LinkParams("frame", "src", 0));
linkParams.put("iframe", new LinkParams("iframe", "src", 0));
linkParams.put("script", new LinkParams("script", "src", 0));
linkParams.put("link", new LinkParams("link", "href", 0));
linkParams.put("img", new LinkParams("img", "src", 0));
linkParams.put("source", new LinkParams("source", "src", 0))

然后可以通过将interval.days添加到您获得的第一个日期来确定范围内的所有日期,其中第一个日期+ spacing.days是< =结束日期,结果日期是新的。通过将间隔交叉连接到您自己的表来完成此操作。类似的东西(它将在SQL中,但你需要翻译):

CREATE TABLE intervals (days int);
INSERT INTO intervals (days) VALUES (0), (1);
DECLARE @rc int;
SELECT @rc = 2;
WHILE (SELECT Count(*) FROM intervals) < 1000 BEGIN
    INSERT INTO intervals (days) SELECT days + @rc FROM intervals WHERE days + @rc < 1000;
    SELECT @rc = @rc * 2
END;

希望这能为您提供一个起点

答案 2 :(得分:0)

试试这个:

with 
  A as (
    select 1 no, to_date('20160401', 'yyyymmdd') dat, 1 cnt from dual union all
    select 1 no, to_date('20160403', 'yyyymmdd') dat, 4 cnt from dual union all
    select 2 no, to_date('20160407', 'yyyymmdd') dat, 3 cnt from dual),
  B as (select min(dat) mindat, max(dat) maxdat from A t),
  C as (select level + mindat - 1 dat from B connect by level + mindat - 1 <= maxdat),
  D as (select distinct no from A),
  E as (select * from D,C)
select E.no, E.dat, nvl(cnt, 0) cnt
from E
full outer join A on A.no = E.no and A.dat = E.dat
order by 1, 2, 3