2011-08-22 56 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點之間。劇本將不會在這些時間之外完成' –