2 u013014182 u013014182 于 2016.03.02 16:17 提问

sql句子查询求大神解决 3C
sql

具体的我忘了,大致意思是,一个网站签到,第一天给1积分第二天给2积分,第三天给3积分。。。。。到第六天为止,其中如果忘签到一天,则下次从第一天开始计算,问这个人一共的多少积分?? 如果用存储过程怎么写
日期
2016-1-01, 2016-1-02,2016-1-03,2016-1-04,2016-1-05,2016-1-06,
2016-1-07,2016-1-08,2016-1-10,2016-1-11,2016-1-12,2016-1-13,
2016-1-15,2016-1-17,2016-1-18

4个回答

enpterexpress
enpterexpress   2016.03.02 16:58

这个好办,写个递归函数

 int <函数名>(<日期>)
{
int result=0;
if(<今日是否签到>)
{
result+=<函数名>(<昨日日期>)+1;
}else
{
result=0;
}
return result;
}

把六天的条件和累计条件写进去

wzgdjm
wzgdjm   2016.03.03 20:49

提供一种思路:如果你这个是第六天后有从一开始算的话,先把所有的数据存数组或者临时表都可以,查询前面连续的天数+1,然后对6取余,最后所有想加。如果连续的第7天是7的话,查询前面的天数+1,最后所有的想加即可。PS:不是很清楚你这里连续6天后是重头计算还是,从1开始。

qq_16414307
qq_16414307   2016.03.04 15:16

这个语句得到签到某天,前5天签到情况,为了简化说明,把日期字段当作数字来处理,你自己可以替换成实际的计算日期天数差的函数
select d
,(select count(*) from t where d=t1.d-1) d1
,(select count(*) from t where d=t1.d-2) d2
,(select count(*) from t where d=t1.d-3) d3
,(select count(*) from t where d=t1.d-4) d4
,(select count(*) from t where d=t1.d-5) d5
from t t1

然后你就可以用case自己计算了
select d,
case d1 when 1 then case d2 when 1 then case d3 when 1 then
case d4 when 1 then case d5 when 1 then 6 else 5 end
else 4 end else 3 end else 2 end else 1 end
from 刚才查询

就是每天的积分获得,然后你自己sum一下就是全部积分了

zhonglongfuwang
zhonglongfuwang   2016.03.09 20:10

加一个字段 连续签到天数:n
根据n 计算一下就行了, 前台还可展示一下 连续签到天数

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!