使用Oracle PL/SQL我需要使用截止日期和完成任務所需的工作時間來計算任務的開始日期。開始日期計算給定結束日期和工作時間PL/SQL
鑑於2012年7月24日17:00爲截止日期,並且需要20小時完成任務並使用8 AM-5PM的工作時間(1小時午餐 - 因此每天最多8小時),我需要在PL/SQL中找出開始日期/時間是什麼......應該在2012年7月22日13:00發佈。
使用Oracle PL/SQL我需要使用截止日期和完成任務所需的工作時間來計算任務的開始日期。開始日期計算給定結束日期和工作時間PL/SQL
鑑於2012年7月24日17:00爲截止日期,並且需要20小時完成任務並使用8 AM-5PM的工作時間(1小時午餐 - 因此每天最多8小時),我需要在PL/SQL中找出開始日期/時間是什麼......應該在2012年7月22日13:00發佈。
下面的代碼可能是一個起點:
function task_start_date(
p_due_date date,
p_working_hours number
) return date
is
l_start_date date;
begin
-- Subtract full days
l_start_date := p_due_date - trunc(p_working_hours/8);
-- Subtract remaining hours
l_start_date := l_start_date - mod(p_working_hours, 8)/24;
-- Fix date if the due date is before 8AM
if to_number(to_char(l_start_date, 'HH24')) < 8 then
l_start_date := l_start_date - 15/24;
end if;
return l_start_date;
end task_start_date;
注意,函數不考慮持續午飯時間。您需要準確定義午餐時間,並相應調整功能。
你確定沒有簡單的單線? :)我不太關心午餐時間,而且這段代碼似乎工作得很好(需要進一步的測試)......但我並不真正瞭解如果在早上8點之前修復日期的代碼。如果它在上午8點之前開始,它會將它推回到一天嗎?我不明白15/24應該做什麼。 – 2012-07-20 13:45:09
假設截止日期是7月24日,10點和11個小時是必需的。然後我首先減去一天(8小時),然後再減去3小時。結果是7月23日7:00,這是當天開始工作之前。所以我再減去15個小時(從下午5點到第二天上午8點)。結果是7月22日16:00。 – Codo 2012-07-20 15:39:28
啊,我現在看到它。因此,我可以添加更多的if語句以確定它是否落在週六或週日,然後減去48/24或24/24小時並將開始日期推回到週五,是否正確? – 2012-07-20 16:12:08
我們需要知道午餐時間。星期幾是否重要(僅在星期一至星期五工作)?另外,你有什麼嘗試? – 2012-07-20 13:25:21
@AdamHawkes是的,只有週一到週五。午餐時間有所不同,但這並不重要,只是每天的工作時間不超過8小時。 – 2012-07-20 15:14:54