2016-11-07 68 views
0

我们有一个表,其中包含所有员工的任务记录。每天需要花费的时间为9.5(不包括午餐休息时间),不管超过的时间是否在未支付栏中。SQL更新以前的记录

在此之前,我们过去把午餐留作空白,但现在他们要求将午餐作为一项任务,因此该午餐时间的小时/分钟已包含在9.5所需的时间内。现在:

  1. 如何将breaktime值从已用时间移到未付时间?
  2. 更新后,我们如何扣除未支付的最后一次未支付任务的休息时间,并将其转移到花费时间以完成每天所需的9.5小时? 谢谢。

enter image description here

回答

-1
UPDATE Your_table_name SET unpaid = spent 
WHERE unpaid = 0 AND TaskName = 'Break Time' 
+0

'WHERE TaskName ='Break Time'' – JimmyB

0

这是一个棘手的任务,并有一个很好的机会,表现会很差,如果你的表包含多条记录。如果是这种情况,那么您可以考虑通过分区表的字段批量运行更新(UserId?)。

假设你的表称为#taskRecord,先花了休息的时间复制到UnpaidSpent字段,然后设置SpentHours0针对断路:

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),这表明没有更多的调整。

+0

这工作完美!非常感谢你:) – SongJoongKi01

+0

@ SongJoongKi01很高兴听到它的工作。为了完整起见,并帮助未来的读者,如果它能完全回答您的问题,您能否将答案标记为Accepted? – mendosi