SQL中基于条件计算含往期周期的病假总天数
嘿,我来帮你搞定这个病假时长合并计算的问题,先把你的原始数据整理成清晰的表格,再一步步拆解计算逻辑~
员工病假原始数据表
| 员工编号(Key) | 开始日期(Start date) | 结束日期(End date) | 本次病假天数(Duration in days) | 上次病假时长(Duration of last sickleave) | 间隔是否不足28天(Less than 28 days) |
|---|---|---|---|---|---|
| 0001 | 01-01-2015 | 14-01-2015 | 13 | 0 | Yes |
| 0001 | 03-03-2015 | 19-03-2015 | 16 | 13 | No |
| 0001 | 2... | — | — | — | — |
(注:第三条记录内容不完整,后续可以按同样逻辑补充处理)
病假时长合并计算逻辑
我把计算步骤拆成简单几步,你跟着走就行:
- 第一步:按员工分组:先把同一个员工编号(Key)的所有病假记录归在一起,比如所有0001的记录单独处理,避免和其他员工的数据混在一起。
- 第二步:算间隔天数:对每一条后续记录,用它的「开始日期」减去上一条记录的「结束日期」,得到两次病假的间隔天数。比如0001的第一次病假结束于14-01-2015,第二次开始于03-03-2015,算下来间隔是48天,确实超过28天,所以不用合并。
- 第三步:判断是否合并周期:如果间隔天数不足28天,就把本次病假天数和之前的累计时长加起来,当成一个连续的病假周期;如果间隔≥28天,就重新开始累计,本次天数作为新周期的起点。
- 第四步:更新累计时长:每处理完一条记录,就更新这个员工的「累计病假时长」,方便下一条记录判断时使用。
举个实际计算例子(基于现有完整记录)
对于员工0001的前两条记录:
- 第一条病假:没有之前的记录,累计时长直接就是13天。
- 第二条病假:间隔48天≥28天,所以累计时长重置为16天,两条记录的总病假时长就是13+16=29天。
要是之后有第三条记录,比如开始日期是20-03-2015(和上次结束日19-03-2015间隔1天,不足28天),病假天数是5天,那这条的累计时长就是16+5=21天,员工0001的总病假时长就变成13+21=34天啦。
内容的提问来源于stack exchange,提问作者Matte
相关产品推荐
相关产品推荐

