17,140
社区成员




select row_number() over(order by to_char(min(t.sj),'YYYY-MM-DD') asc,to_char(max(t.sj),'YYYY-MM-DD') asc,yh.yh asc) xh,
to_char(min(t.sj),'YYYY-MM-DD') mindt,to_char(max(t.sj),'YYYY-MM-DD') maxdt
,TO_CHAR(t.sj, 'iw') zrz--自然周(数字,表示一年的第几周)
,yh.yh xm
,count(1) zsl,sum(case when t.zt<>0 then 1 else 0 end) as wdq,sum(case when t.zt=0 then 1 else 0 end) as ydq
from cxx t
left join YH yh on t.ry=yh.h
WHERE t.sj between to_date('2019-04-25 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2019-09-25 23:59:59','yyyy-mm-dd hh24:mi:ss')
group by to_char(t.sj ,'iw'),to_char(t.sj,'mm'),yh.yh;
第三条的介绍,001用户在自然周zrz=31的mindt至maxdt时间段(闭区间)有数据,总数为56
所以第四条的介绍也是一样的:00香用户在自然周zrz=31的mindt至maxdt时间段(闭区间)有数据,总数为13
mindt至maxdt时间段(闭区间)表示:mindt到maxdt这几天都是有记录数据,
mindt与maxdt不一定指的是一周的周一与周日,但一定在该周内,
则用java代码处理一下:
。。。代码蛮多的,反正做判断的思路:
mindt大于周的周一,但小于下个月的第一天对应的星期,则mindt值改为周一,maxdt小于周的周日,也小于下个月的第一天对应的星期,则maxdt值改为这个月的最后一天对应的星期,
若mindt大于周一也大于下月第一天对应的星期,maxdt小于周日但大于下月第一天对应的星期,则分别改下月第一天对应的星期、周日
注: 不可能mindt小于下月第一天对应的星期而maxdt大于下月第一天对应的星期,
还要注意若maxdt等于下月第一天对应的星期或周日等等情况。。。。
对,方法很麻烦,但是我真的想不出如何用SQL语句实现,怎么写都会有点问题(不是想要的答案),,,方法很多种就是要花时间研究,但是模块花费时间太长,同事在催进度,我只能这样写with tab1 as (
select to_date('20190520', 'yyyymmdd') + level dt
from dual
connect by level <= 20
)
select min(t1.dt),
max(t1.dt)
from tab1 t1
group by to_char(t1.dt, 'mm'), to_char(t1.dt + 1, 'ww')
order by min(t1.dt)
;