2012-07-20 331 views
0

使用Oracle PL/SQL我需要使用截止日期和完成任务所需的工作时间来计算任务的开始日期。开始日期计算给定结束日期和工作时间PL/SQL

鉴于2012年7月24日17:00为截止日期,并且需要20小时完成任务并使用8 AM-5PM的工作时间(1小时午餐 - 因此每天最多8小时),我需要在PL/SQL中找出开始日期/时间是什么......应该在2012年7月22日13:00发布。

+1

我们需要知道午餐时间。星期几是否重要(仅在星期一至星期五工作)?另外,你有什么尝试? – 2012-07-20 13:25:21

+0

@AdamHawkes是的,只有周一到周五。午餐时间有所不同,但这并不重要,只是每天的工作时间不超过8小时。 – 2012-07-20 15:14:54

回答

2

下面的代码可能是一个起点:

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; 

注意,函数不考虑持续午饭时间。您需要准确定义午餐时间,并相应调整功能。

+0

你确定没有简单的单线? :)我不太关心午餐时间,而且这段代码似乎工作得很好(需要进一步的测试)......但我并不真正了解如果在早上8点之前修复日期的代码。如果它在上午8点之前开始,它会将它推回到一天吗?我不明白15/24应该做什么。 – 2012-07-20 13:45:09

+0

假设截止日期是7月24日,10点和11个小时是必需的。然后我首先减去一天(8小时),然后再减去3小时。结果是7月23日7:00,这是当天开始工作之前。所以我再减去15个小时(从下午5点到第二天上午8点)。结果是7月22日16:00。 – Codo 2012-07-20 15:39:28

+0

啊,我现在看到它。因此,我可以添加更多的if语句以确定它是否落在周六或周日,然后减去48/24或24/24小时并将开始日期推回到周五,是否正确? – 2012-07-20 16:12:08

相关问题