重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
以下以2013年11月为例
站在用户的角度思考问题,与客户深入沟通,找到孝义网站设计与孝义网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广、申请域名、网页空间、企业邮箱。业务覆盖孝义地区。
1、使用横向连接,以5天为例,简单但不易扩展
with data as ( select * from yourtable where date='2013-11-01' and date'2013-12-01')
select distinct name
from data t1 join data t2 on t1.name=t2.name and t1.date=t2.date+1
join data t3 on t2.name=t3.name and t2.date=t3.date+1
join data t4 on t3.name=t4.name and t3.date=t4.date+1
join data t5 on t4.name=t5.name and t4.date=t5.date+1
2、使用纵向分组统计
with t1(id,rq) as (
select distinct 人员, date from 表 where date='2013-11-01' and date'2013-12-01' ),
--t1求出指定月的人员编号及不同的打卡日期
t2 as (select s2.* from t1 s1 join t1 s2 on s1.id=s2.id and s1.rq=s2.rq-1),
--t2求出所有上一日也打过卡的日期
t3 as (select * from t1 except select * from t2),
--t3求出所有上一日未打过卡的日期
t as (
select id,rq,1 days from t3
union all
select t1.id,t1.rq,t.days+1 from t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
--t4递归调用,每连续一日days+1,就是求每一打卡时间是连续的第几天
select id
from t
group by id
having max(days)=5
order by id
以上就不删了,以下可以改短点吧
with t as (
select 人员 id, date rq, 1 days from 表 t1
where not exists(select * from 表 t2 where t2.date=t1.date-1)
union all
select t1.id,t1.rq,t.days+1 from 表 t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
select id
from t
group by id
having max(days)=5
order by id
dateadd是一个用来相加的一个函数,dd指的是日期里面的日,DATEADD(dd,
DATEDIFF(dd,0,getdate()),
0)
意思是将DATEDIFF(dd,0,getdate())函数返回的日期增加0天,如果将0改成1,DATEADD(dd,
DATEDIFF(dd,0,getdate()),
1)那就是加一天
DATEDIFF函数返回的是两个日期之间的间隔,dd就是间隔多少天。
sqlserver的周是以周日开始算的
利用select datepart(weekday, ‘2013-01-01’)获取本年第一天是第一周的第几天,就可以算出第二周从哪一天开始,以后就每周7天算下去。
利用SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))获取本年的最后一天,再算出最后一天是该周的第几天。