我们有一个表,其中包含所有员工的任务记录。每天需要花费的时间为9.5(不包括午餐休息时间),不管超过的时间是否在未支付栏中。SQL更新以前的记录
在此之前,我们过去把午餐留作空白,但现在他们要求将午餐作为一项任务,因此该午餐时间的小时/分钟已包含在9.5所需的时间内。现在:
- 如何将breaktime值从已用时间移到未付时间?
- 更新后,我们如何扣除未支付的最后一次未支付任务的休息时间,并将其转移到花费时间以完成每天所需的9.5小时? 谢谢。
我们有一个表,其中包含所有员工的任务记录。每天需要花费的时间为9.5(不包括午餐休息时间),不管超过的时间是否在未支付栏中。SQL更新以前的记录
在此之前,我们过去把午餐留作空白,但现在他们要求将午餐作为一项任务,因此该午餐时间的小时/分钟已包含在9.5所需的时间内。现在:
UPDATE Your_table_name SET unpaid = spent
WHERE unpaid = 0 AND TaskName = 'Break Time'
这是一个棘手的任务,并有一个很好的机会,表现会很差,如果你的表包含多条记录。如果是这种情况,那么您可以考虑通过分区表的字段批量运行更新(UserId
?)。
假设你的表称为#taskRecord
,先花了休息的时间复制到UnpaidSpent
字段,然后设置SpentHours
到0
针对断路:
Update #taskRecord
Set UnpaidSpent = SpentHours
Where TaskName = 'Break Time';
Update #taskRecord
Set SpentHours = 0
Where TaskName = 'Break Time';
然后我们需要确定哪些是行每天第一排有没有付费的时间(不包括午休行)。如果我们还没有累计9.5天的付费时间,那么请将部分时间从未付款栏位转到付费栏位。
With runningTotalHours As (
Select UserID, WorkDateTime = WorkDate, WorkDate = Convert(date, WorkDate), SpentHours, UnpaidSpent, TaskName,
Sum(SpentHours + UnpaidSpent) Over (Partition By UserId, Convert(date, WorkDate)
Order By WorkDate
Rows Between Unbounded Preceding And Current Row) As RunningTotalAll,
Sum(SpentHours) Over (Partition By UserId, Convert(date, WorkDate)
Order By WorkDate
Rows Between Unbounded Preceding And Current Row) As RunningTotalPaid
from #taskRecord
Where TaskName <> 'Break Time'),
RowsWithUnpaidHours As (
Select UserID, WorkDateTime, WorkDate, SpentHours, UnpaidSpent, TaskName, RunningTotalAll, RunningTotalPaid,
Row_Number() Over (Partition By UserId, WorkDate Order By WorkDateTime) As RowNo
From runningTotalHours
Where UnpaidSpent <> 0)
Update RowsWithUnpaidHours
Set SpentHours = CASE WHEN RunningTotalAll < 9.5 Then SpentHours + UnpaidSpent
ELSE SpentHours + 9.5 - RunningTotalPaid END,
UnpaidSpent = CASE WHEN RunningTotalAll < 9.5 Then 0
ELSE UnpaidSpent - 9.5 + RunningTotalPaid END
Where RowNo = 1 And RunningTotalPaid <> 9.5;
为确保一致性,此操作只更新每天第一行的未付费时间。但是可能会有几天,一个人在一天结束时的无报酬时间内完成多项任务,现在在午餐时间结束后将被视为已付款。所以有必要多次运行上面的语句,直到它报告(0 row(s) affected)
,这表明没有更多的调整。
这工作完美!非常感谢你:) – SongJoongKi01
@ SongJoongKi01很高兴听到它的工作。为了完整起见,并帮助未来的读者,如果它能完全回答您的问题,您能否将答案标记为Accepted? – mendosi
'WHERE TaskName ='Break Time'' – JimmyB