扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:赛迪网 Jane 来源:天新网 2008年4月24日
关键字: 数据库 Mssql SQL SQL Server
业务需求是每周一和周四结算奖金,不难发现奇数次结算依次相差7天,偶数次结算依次相差7天,相邻奇数次和偶数此结算相差3天,可以使用求余的方式来统一这个问题。如果当前天数(days)与7求余结果为0或者当前天数(days)减去 3之后求余的结果为0,则当前天数是结算的日期。具体的实现的算法是:
1、提取当前的天数到一个变量中declare @days int set @days=(select days from misc)。
2、判断是否满足结算条件if @days%7=0 or (@days-3)%7=0 begin…end。
类似于这样简单的算法可以直接的应用到数据库中而不会发生问题。
复杂的业务规则需要复杂的算法,复杂的规则对于一个有具体数字的变量来说,实现起来已经比较复杂,如果应用到数据库中存储的杂乱无章的一大批数字,并且实现批量的计算,则需要对算法进行大幅度的调整。
比如业务规则需要在员工每4000元的奖金中扣除400元作为重复消费,并且在扣除最后的400元,重复消费一次奖励一件产品,需要在数据库中使用一个表(award_repeat)记录产生的重复消费。如果一次扣除的奖金不足400 元,在下次结算的时候接着扣除,直到扣除的奖金够400元,然后奖励一件产品,进入下次的循环,比如现在奖金总数达到了3600元,则不会扣除,如果达到了3700元,则要扣除100元,如果达到了7700元,则要扣除410元,并且产生一个重复消费。
为了实现这个规则,在员工表(member)中记录每个员工奖金的总数([total_award]),同时记录重复消费的次数([repeat_num]),在另外的过渡表(award_day)中记录每次的奖金和每次扣除重复消费的奖金,最后在奖金表(award)中综合当次奖金和当次结算需要扣除的重复消费就得到了当次结算实际发放的奖金。采用批量的计算方法,实现的算法是:在计算奖金之后,扣除重复消费之前把当前奖金累加到员工的([total_award])字段([total_award]),记录没有扣除重复消费的所有的奖金总和。实现重复消费计算的的算法是,设定条件(F1)为在member表中存在奖金总数大于等于重复消费次数加1后乘以4000,如果有满足条件F1的记录,则选择满足条件的纪录中主键和当前的日期(days)插入到重复消费表(award_repeat)中,然后更新member表中满足条件F1的repeat_num使其增加1,重复检查条件F1,直到member表中没有满足条件F1纪录。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者