最近的一個項目中有一個統計用戶連續簽到指定天數的需求,要是單單統計最后一次連續簽到的次數也不是什么難事,偏偏需求是查詢出指定時間段內連續簽到指定天數的用戶。
本來一開始覺着也不是很難,但思考了一會之后發現,要判斷是否連續,用sql語句對我來說還是有不小的難度,於是乎開始google sql連續日期,也可能是本人不會搜索,找了半天沒有找到自己想要的,或者對我有幫助的代碼片段或者示例。
就這樣白白浪費了一中午的時間,既然搜不到,那就自己想辦法。既然難點是判斷日期連續,我能不能這樣做呢,把指定的時間段,拆分成N多個指定天數且連續的時間小時間段呢?貌似這樣可行,說做就做,記錄用戶簽到的表結構是這樣的
用戶每天僅能簽到一次(記錄一次),下面是查詢滿足條件的用戶sql代碼片段
1 declare @BeginDate datetime,--開始時間段 2 @EndDate datetime,--結束時間段 3 @Days int;--連續天數 4 5 set @BeginDate='2015-05-01'; 6 set @EndDate='2015-05-15'; 7 set @Days=3; 8 9 DECLARE @LoopTimes INT=0; 10 SET @LoopTimes=DATEDIFF(DAY,@BeginDate,@EndDate)-@Days+1; 11 12 IF OBJECT_ID('#TempUserSignin','U') IS NOT NULL 13 DROP TABLE #TempUserSignin; 14 15 CREATE TABLE #TempUserSignin 16 ( 17 UserID INT, 18 Counts INT 19 ); 20 21 WHILE (@LoopTimes>0) 22 BEGIN 23 24 INSERT INTO #TempUserSignin(UserID,Counts) 25 SELECT UserID,COUNT(1) AS Counts 26 FROM UserSigninLog WHERE LogTime BETWEEN @BeginDate AND DATEADD(DAY,@Days-1,@BeginDate)+'23:59:59.998' GROUP BY USERID; 27 28 SET @BeginDate=DATEADD(DAY,1,@BeginDate) 29 SET @LoopTimes=@LoopTimes-1; 30 END 31 32 SELECT MAX(Counts) AS Counts,UserID FROM #TempUserSignin WHERE Counts>=@Days GROUP BY UserID 33 DROP TABLE #TempUserSignin;
下面是用戶簽到記錄表里面的測試數據
上面sql的執行結果如下:
我是低調的結尾,看到這就結束了哦