MYSQL實現連續簽到功能,斷籤一天從頭開始

2021-08-01 13:50:08 字數 4322 閱讀 2258

1,建立測試表

create table `testsign` (

`userid` int(5) default null,

`username` varchar(20) default null,

`signtime` timestamp not null default current_timestamp on update current_timestamp,

`type` int(1) default '0' comment '為0表示簽到資料,1表示簽到日期字典資料'

) engine=innodb default charset=utf8

2,插入測試資料,簽到時間為5.21號到6.5號,可以寫活,但是要寫儲存過程,我比較懶,重點應該是取簽到資料的**,就是第三點,呵呵

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-21 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-22 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-23 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-24 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-25 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-26 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-27 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-28 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-29 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-30 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-05-31 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-06-01 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-06-02 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-06-03 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-06-04 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('72164','字典','2017-06-05 00:00:00','1');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-21 00:00:00','0');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-22 00:00:00','0');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-23 00:00:00','0');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-24 00:00:00','0');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-25 00:00:00','0');

insert into `testsign` (`userid`, `username`, `signtime`, `type`) values('800675','吳小雙簽到資料','2017-05-26 00:00:00','0');

3,查詢連續簽到資料鑑於很多人沒試驗成功,就把這條sql的意思寫一下,這條sql的意思是:場景:連續簽到日期範圍是2017-05-21 到2017-06-05,字典資料已經提前存入到表裡。簽到資料,是使用者的簽到資料,      type=0,每簽到一次,會往表裡插入一條資料。sql的意思:去查詢字典表(type=1),且日期在今天之前,並且日期不在簽到資料日期裡面,這樣查出來的是漏籤的日期,再拿這些漏簽的日期的最大日期,去簽到資料裡面(type=0)查詢資料範圍大於漏簽日期且小於截止日期(2017-06-05)的資料就是連續簽到的日期。如果查不到漏簽的最大日期,則表示沒有漏簽,則起始日期是2017-05-21

select * from testsign  where type=0  and

date_format(signtime,'%y%m%d')>(

select ifnull(max(date_format(signtime,'%y%m%d')),"20170520") from testsign where type=1

and date_format(signtime,'%y%m%d')<=date_add(now(), interval -1 day)

and date_format(signtime,'%y%m%d') not in (

select date_format(signtime,'%y%m%d') from testsign where type=0 and userid=800675

)) and date_format(signtime,'%y%m%d')<='20170605'

and userid=800675

未斷資料

刪掉23號資料,從24號開始算,連續籤三天

4,完事了~~~~~

mysql 連續簽到天數 幾種簽到功能的對比

簽到送豪禮 按照計分方式區分,簽到分為兩種 1.按累計時間簽到,2.按連續時間簽到。按照表現形式區分,簽到形式較多 日曆簽到 進度條簽到 累計分數簽到等,甚至送鮮花等行為也勉強可以歸為簽到的變種。但是無論表現形式怎麼變化,基本都可以歸為以上兩種計分方式。兩種簽到方式有不同的作用。按累計時間簽到,根據...

mysql 連續簽到天數 最大連續簽到天數 sql

select min rq as 起始日期 max rq as 終止日期 max id1 min id1 1 as 持續天數 id3 as 累計簽到天數 name from select datediff rq,2020 02 01 id1 select count 1 from tmptable ...

java 判斷一段日期內連續簽到天數

此處就拿休假部分做例子分析 連續休假要通過兩個相鄰日期間隔是否是一天,定義變數記錄。如果兩個相鄰日期間隔超過一天,重新賦值為1,超過4天就返回 貼一下測試 public class continueattend public static void main string args try list...