某个用户的ID下有一个字段count用于记录其帐户点数余额,因为有一个试用功能,需要在注册及完成特定任务时赠送一些点数,所以另设置一字段count_temp,并为此字段内的余额设置一个月有效期,赠送的点数必须在赠送后一个月内使用,否则过期作废。但是这样用户在需要扣点数的时候必须判断两字段值,实现起来比较麻烦,但如果只用一字段又无法为赠送的点数作有效期计算,不得其解,特请高人指点非常感谢。

解决方案 »

  1.   

    --用一个计算列放可用点数.
    --在扣点的时候,先扣赠送点数
    create table tb(id int,购买点数 int,赠送点数 int,赠送日期 datetime,
    可用点数 as (case when datediff(d,赠送日期,getdate())<=30 then 购买点数+赠送点数 else 购买点数 end))
    go
    insert into tb(id,购买点数,赠送点数,赠送日期) select 1,500,60,'2011-10-11'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 2,500,60,'2011-10-18'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 3,500,60,'2011-10-26'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 4,500,60,'2011-11-11'
    go
    select * from tb
    /*
    id          购买点数        赠送点数        赠送日期                    可用点数
    ----------- ----------- ----------- ----------------------- -----------
    1           500         60          2011-10-11 00:00:00.000 500
    2           500         60          2011-10-18 00:00:00.000 500
    3           500         60          2011-10-26 00:00:00.000 560
    4           500         60          2011-11-11 00:00:00.000 560(4 行受影响)*/
    go
    drop table tb
    帮你顶一下.
      

  2.   

    谁都是从不会来的.
    可以采用存储过程来处理,参考:create table tb(id int,购买点数 int,赠送点数 int,赠送日期 datetime,
    可用点数 as (case when datediff(d,赠送日期,getdate())<=30 then 购买点数+赠送点数 else 购买点数 end))
    go
    insert into tb(id,购买点数,赠送点数,赠送日期) select 1,500,60,'2011-10-11'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 2,500,60,'2011-10-18'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 3,500,60,'2011-10-26'
    insert into tb(id,购买点数,赠送点数,赠送日期) select 4,500,60,'2011-11-11'
    go
    --扣点:
    create procedure updatetb(@id int,@p int)
    as
    update tb set 
    赠送点数=赠送点数-(case when datediff(d,赠送日期,getdate())<=30 and @p<赠送点数 then @p
    else 赠送点数
    end),
    购买点数=购买点数-(case when datediff(d,赠送日期,getdate())<=30 and @p<赠送点数 then 0
    when datediff(d,赠送日期,getdate())<=30 and @p>赠送点数 then @p-赠送点数
    else @p
    end)
    where id=@id
    go
    exec updatetb 2,100
    exec updatetb 3,100
    exec updatetb 4,45
    exec updatetb 1,45select * from tb
    /*
    id          购买点数        赠送点数        赠送日期                    可用点数
    ----------- ----------- ----------- ----------------------- -----------
    1           455         0           2011-10-11 00:00:00.000 455
    2           400         0           2011-10-18 00:00:00.000 400
    3           460         0           2011-10-26 00:00:00.000 460
    4           500         15          2011-11-11 00:00:00.000 515(4 行受影响)*/
    go
    drop table tb
    drop procedure updatetb
      

  3.   

    非常感谢qianjin036a,经你热心的讲解我大约都有了思路了。我先试试看,一伙就结贴.谢谢回贴的众高手们。