2011-08-22 59 views
0

好的,不是一个编程问题,但我似乎只能想到真正复杂的方法来解决这个问题。工作时间完成时间

我们在办公室里有一个脚本。我们需要确定此脚本只在工作时间内工作多长时间(工作时间为上午9点至下午5点)。例如,假设脚本在星期一下午2点开始,并在星期二下午4点结束。该脚本花了26个小时完成,但只完成了10个小时。该脚本可以在一个工作日内完成,但也可以跨越多天。脚本只能在工作日开始和结束。时间戳是用Unix格式完成的。

我不知道这是如何在SQL中完成的,但我知道网络管理员更喜欢这个。

服务器端脚本语言是PHP。所以这将是第二个可用选项。我尝试低于:

$workingDay = 24; 
$workingDayHours = 8; 
$workingTime = 0; 

while($timeTaken >= $workingDay) { 
    $workingTime += $workingDayHours; 
    $timeTaken -= $workingDay; 
} 
$workingTime += $timeTaken; 

我真的不能认为正确,现在,太多的工作,所以这种方法虽然是哑巴,似乎在这种情况下工作,因为$ timeTaken永远是< = 8 || > = 24.

不管怎么说,看到一个更好更智能的方法(或许可以在任何小时内工作的方法)都是非常棒的。 SQL也很棒。在小时... (未测试对不起)

经过的时间

+0

如果脚本在工作日的下午5点之前未完成,会怎样?它在第二天早上9点暂停并恢复吗?还是继续 - 在这种情况下,如果在晚上9点结束会发生什么? –

+0

周末怎么样?星期五下午4点在星期六和星期日运行,星期一,上午9点结束,计为2小时? – arnep

+0

@ aleks-g呃,我不知道这个系统是如何放在一起的,但显然时间戳只能在上午9点和下午5点之间。脚本不会在这些时间之外完成。 –

回答

0

这样的事情(00只会工作,如果工作的开始和结束之间的9:00-17):

HOUR(TIMEDIFF(enddatetime-startdatetime)) 

要计算的工作小时数:

我们需要删除作业没有运行, 的N 16小时的时间(超过16小时运行的任何工作都必须运行在n天)

duration - (FLOOR(duration/16)*16) 

获得:

SELECT HOUR(TIMEDIFF(enddatetime-startdatetime)) - 
      (FLOOR(HOUR(TIMEDIFF(enddatetime-startdatetime))/16)*16) AS duration 

如果你想删除周末,你可以简单地看一下开始和结束的周数,如果他们是不一样的删除48小时(每个周末的作业运行然后从上述时间段中删除此值

(week(enddatetime,1) - week(startdatetime,1)) * 48 
+0

this下午7点至20点运行返回3,应该为0。 – Tsar

+0

此外,如果运行时间是下午4点到第二天早上7点,则您的公式将返回0(15-15),当它应该为1时。 – Tsar

+0

您非常正确,只有在工作时间开始和结束时才会起作用(9 -5),但请参阅Carls先生的评论:“显然,时间戳只能在上午9点和下午5点之间。剧本将不会在这些时间之外完成' –