根据给定的结束日期和工作时间PL/SQL计算的开始日期

根据给定的结束日期和工作时间PL/SQL计算的开始日期,sql,oracle,datetime,plsql,Sql,Oracle,Datetime,Plsql,使用OraclePL/SQL,我需要使用截止日期和完成任务所需的工作时间来计算任务的开始日期 鉴于2012年7月24日17:00为截止日期,20小时为完成任务所需的时间,并使用上午8点至下午5点的工作时间(1小时午餐-每天最多8小时),我需要在PL/SQL中计算开始日期/时间。。。将于2012年7月22日13:00发布。以下代码可以作为起点: function task_start_date( p_due_date date, p_working_hours number ) retur

使用OraclePL/SQL,我需要使用截止日期和完成任务所需的工作时间来计算任务的开始日期


鉴于2012年7月24日17:00为截止日期,20小时为完成任务所需的时间,并使用上午8点至下午5点的工作时间(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;
功能任务\u开始\u日期(
p_到期日,
p_工作小时数
)返回日期
是
l_开始日期;
开始
--减去全天
l_开始日期:=p_到期日期-trunc(p_工作时间/8);
--减去剩余的小时数
l_开始日期:=l_开始日期-mod(p_工作时间,8)/24;
--如果到期日在上午8点之前,请确定日期
如果to_number(to_char(l_start_date,'HH24'))<8,则
l_开始日期:=l_开始日期-15/24;
如果结束;
返回l_开始日期;
结束任务\开始\日期;

注意,该函数并不总是考虑午餐时间。您需要准确定义午餐时间,并相应调整函数。

我们需要知道午餐时间的时间。一周中的哪一天重要吗(只在周一到周五工作)?还有,你试过什么?@AdamHawkes是的,只有周一到周五。午餐时间各不相同,但这并不重要,只是每天的工作时间不超过8小时。你确定没有简单的一行吗?:)我不太关心午餐时间,这段代码似乎工作得很好(需要进一步测试)。。。但我真的不明白,如果是在上午8点之前,如何确定日期。如果它在早上8点之前开始,它会把它推迟一天吗?我不明白15/24应该做什么。假设截止日期是7月24日,需要10:00和11小时。然后我先减去一天(8小时),然后再减去3小时。结果是7月23日7:00,也就是当天上班之前。所以我再减去15个小时(从下午5点到第二天早上8点)。结果是7月22日16点。啊,我现在看到了。所以我可以再加上一些if语句来确定它是落在Sat还是太阳上,然后减去48/24或24/24小时,把开始日期推回到周五,对吗?