日度归档:2019年1月5日

mssql sqlserver 使用sql脚本找出连续签到的天数的方法分享


摘要:
下文讲述日常工作中,使用sql脚本找出连续签到的天数的方法分享,如下所示:
实验环境:sql server 2008 R2


create table [maomao365](rq datetime)
go
insert into [maomao365] values('2018.1.1')
insert into [maomao365]  values('2018.1.2')
insert into [maomao365]  values('2018.1.3')
insert into [maomao365]  values('2018.1.6')
insert into [maomao365]  values('2018.1.7')
insert into [maomao365]  values('2018.1.10')
insert into [maomao365]  values('2018.1.11')
insert into [maomao365]  values('2018.1.12')
insert into [maomao365]  values('2018.1.19')
insert into [maomao365]  values('2018.1.20')
insert into [maomao365]  values('2018.1.22')
insert into [maomao365]  values('2018.1.23')
insert into [maomao365]  values('2018.1.28')
go
---运行后的效果
--起始日期      终止日期     连续签到天数   离上一期天数
--2018.1.1     2018.1.3      3        0
--2018.1.6     2018.1.7      2        3
--2018.1.10    2018.1.12     3        3
--2018.1.19    2018.1.20     2        7
--2018.1.22    2018.1.23     2        2
--2018.1.28    2018.1.28     1        5


SELECT 起始日期 = MIN(rq)
	, 终止日期 = MAX(rq)
	, 连续签到天数 = MAX(id1) - MIN(id1) + 1
	, 离上一期天数 = CASE a.id1 - a.id2
		WHEN -1 THEN 0
		ELSE MAX(datediff(d, rq2, rq))
	END
FROM (
	SELECT id1 = datediff(d, '2018-01-01', rq)
		, id2 = (
			SELECT COUNT(1)
			FROM [maomao365]
			WHERE rq <= a.rq
		), rq2 = (
			SELECT MAX(rq)
			FROM [maomao365]
			WHERE rq < a.rq
		)
		, *
	FROM [maomao365]  a
) a
GROUP BY a.id1 - a.id2