两日期区间连续日期统计问题

ptma 2009-07-27 06:56:26
现有表 A
内有一 Date 字段 dt

要求:给定起始日期和终止日期, 要查出这两个日期区间内所有连续日期的记录数量

如:
数据
dt
2009-07-01
2009-07-01
2009-07-01
2009-07-02
2009-07-04
2009-07-04
2009-07-05

给定条件 起始日期:2009-07-01 终止日期:2009-07-05

那么结果应当是
2009-07-01 3
2009-07-02 1
2009-07-03 0 --dt字段为这个日期的没有记录
2009-07-04 2
2009-07-05 1


向众高手高分求救了

-------------
给分500, 因发不了高于100分的帖子,会开贴追加
...全文
345 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
inthirties 2009-07-27
  • 打赏
  • 举报
回复
我也来一个

with temp as
(
select to_date('2009-07-01', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-01', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-01', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-02', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-04', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-04', 'yyyy-mm-dd') dt from dual
union all
select to_date('2009-07-05', 'yyyy-mm-dd') dt from dual
)



select b.dt, count(temp.dt) from (SELECT to_date('2009-07-01', 'yyyy-mm-dd')+rownum-1 dt from dual connect by to_date('2009-07-01', 'yyyy-mm-dd')+(rownum-1) <= to_date('2009-07-05', 'yyyy-mm-dd')) b, temp where b.dt=temp.dt(+) group by b.dt order by b.dt;
yjdfff 2009-07-27
  • 打赏
  • 举报
回复
SELECT B.DT,COUNT(A.DT) CNT FROM
(SELECT to_date('2009-01-01','yyyy-mm-dd')+ROWNUM DT FROM DUAL
CONNECT BY LEVEL<=365) B,A
WHERE B.DT=A.DT(+) AND B.DT BETWEEN to_date('2009-07-01','yyyy-mm-dd') and
to_date('2009-07-05','yyyy-mm-dd')
GROUP BY B.DT
ORDER BY DT

结果:
DT CNT
2009-7-1 3
2009-7-2 1
2009-7-3 0
2009-7-4 2
2009-7-5 1
yjdfff 2009-07-27
  • 打赏
  • 举报
回复
select dt,count(*) from a where dt between to_date('2009-07-01','yyyy-mm-dd') and to_date('2009-07-05','yyyy-mm-dd') group by dt
quiettown 2009-07-27
  • 打赏
  • 举报
回复
此话有理。。。。
lzf616 2009-07-27
  • 打赏
  • 举报
回复
恩,确实,但是ALL_OBJECTS 里面有30000条数据左右,也就相当与100年(一个世纪的数据),这个应该很少人会这么查询的,或者说不可能。尽管理论上不够严密,但实际已经足够。
quiettown 2009-07-27
  • 打赏
  • 举报
回复
SQL> select b.dt, count(a.dt) from (
2 select to_date('2009-07-01', 'yyyy-mm-dd') - 1 + rownum dt
3 from (select 1 from dual group by cube(1,2,3,4,5,6,7))
4 ) b, a where a.dt(+) = b.dt
5 and b.dt between to_date('2009-07-01', 'YYYY-MM-DD') and to_date('2009-07-05', 'YYYY-MM-DD')
6 group by b.dt
7 order by b.dt;

DT COUNT(A.DT)
-------------- -----------
01-7月 -09 3
02-7月 -09 1
03-7月 -09 0
04-7月 -09 2
05-7月 -09 1

如果想大点儿,就CUBE多点,再多也能装下。。。
shiyiwan 2009-07-27
  • 打赏
  • 举报
回复
若记录数比较少,换个记录数最大的系统表或者用union all?

明天再想想。。
[Quote=引用 9 楼 ptma 的回复:]
#6 不行
#7 all_objects 记录数不定,有可能存在 需要生成的日期数量>all_objects记录数 的情况
[/Quote]
ptma 2009-07-27
  • 打赏
  • 举报
回复
#6 不行
#7 all_objects 记录数不定,有可能存在 需要生成的日期数量>all_objects记录数 的情况
hebo2005 2009-07-27
  • 打赏
  • 举报
回复
楼上应该OK了,主要就是在生成日期上
shiyiwan 2009-07-27
  • 打赏
  • 举报
回复
若dual不行的话换成其他系统表试试,呵呵,比如下面这个,不用connect by
select t.dt, count(1) 
from (select to_date('2009-07-01', 'yyyy-mm-dd') - 1 + rownum dt
from all_objects
where rownum <= to_date('2009-07-05', 'yyyy-mm-dd')
- to_date('2009-07-01', 'yyyy-mm-dd')
+ 1
) t,
A a
where t.dt = a.dt(+)
group by t.dt;
shiyiwan 2009-07-27
  • 打赏
  • 举报
回复
不好意思,发现原来用了一个多余的表,看来只能用dual了,
那么稍微修改下,试试吧,在家没法测试,应该差不多
select t.dt, count(1) 
from (
select to_date('2009-07-01', 'yyyy-mm-dd') - 1 + rownum dt
from dual
connect by rownum <= to_date('2009-07-05', 'yyyy-mm-dd')
- to_date('2009-07-01', 'yyyy-mm-dd')
) t,
A a
where t.dt = a.dt(+)
group by t.dt;
[Quote=引用 5 楼 shiyiwan 的回复:]
SQL codeselect t.dt,count(1)from (SELECT begin_date+level-1 dtFROM test connectBY begin_date+level-1<= end_date) t,
A awhere t.dt= a.dt(+)groupby t.dt;
[/Quote]
shiyiwan 2009-07-27
  • 打赏
  • 举报
回复
select t.dt, count(1) 
from (SELECT begin_date + level -1 dt FROM test connect BY begin_date + level -1 <= end_date) t,
A a
where t.dt = a.dt(+)
group by t.dt;
ptma 2009-07-27
  • 打赏
  • 举报
回复
再补充一下,不用存储和函数,要求纯 SQL
quiettown 2009-07-27
  • 打赏
  • 举报
回复
噢,忘了加条件。。。
select dt, count(*) from a where dt between '2009-07-01' and '2009-07-05' group by dt
ptma 2009-07-27
  • 打赏
  • 举报
回复
注意看题

2009-07-03 的呢?
quiettown 2009-07-27
  • 打赏
  • 举报
回复
这个貌似很简单的啊,不值当那么多分儿。。。
select dt, count(*) from a group by dt

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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