2016-11-07 64 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