我們有一個表,其中包含所有員工的任務記錄。每天需要花費的時間爲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