2017-09-25 263 views
0

我花了數小時和無數頁的筆記本紙試圖弄清楚這一點。班次日曆 - 根據給定模式確定班次

我需要的是能夠找出什麼輪班值班的某一天,而不必手動輸入每年的所有班次。

消防部門的常見班次是48關閉24,但我們工作48關閉96。因此,給定一個開始日期,例如9-23-17,作爲CCAABB模式從那天開始C班的第一天,我該如何計算出哪個班次值班?換班時間並不重要,我只需要知道每天哪個班次。

我一直在拉我的頭髮,從我能想到的每一個角度來工作,但沒有找到解決方案。

+0

用您正在使用的數據庫標記您的問題。 –

回答

0

如果你只是需要在不使用數據庫來計算,PHP的日期時間函數能完成這個任務:

// set this to the first day shift 'A' is on 
$startShiftA = new DateTime('2017-09-23'); 

// set this to the day to find which shift is working 
$dayToTest = new DateTime('2017-09-25'); 

$shiftOnDuty = array(
    '0' => 'A', 
    '1' => 'A', 
    '2' => 'B', 
    '3' => 'B', 
    '4' => 'C', 
    '5' => 'C' 
); 

echo $shiftOnDuty[$dayToTest->diff($startShiftA)->format('%d')%6]; 

那最後一個襯墊有點拗口,所以一步一步,這是它做什麼:

  1. 查找天的區別:$dayToTest->diff($startShiftA)->format('%d')
  2. 查找模(差的剩餘天數除以6):%6
  3. 這產生一個範圍在[0-5]的數字。 [0-1]被移A,[2-3]是移位B,和[4-5]是移C.
  4. 使用該號碼作爲$shiftOnDuty

樣品運行的索引:

php > // set this to the first day shift 'A' is on 
php > $startShiftA = new DateTime('2017-09-23'); 
php > 
php > // set this to the day to find which shift is working 
php > $dayToTest = new DateTime('2017-09-25'); 
php > 
php > $shiftOnDuty = array(
php ( '0' => 'A', 
php ( '1' => 'A', 
php ( '2' => 'B', 
php ( '3' => 'B', 
php ( '4' => 'C', 
php ( '5' => 'C' 
php (); 
php > 
php > echo $shiftOnDuty[$dayToTest->diff($startShiftA)->format('%d')%6]; 
B 
php > $dayToTest = new DateTime('2017-09-27'); 
php > echo $shiftOnDuty[$dayToTest->diff($startShiftA)->format('%d')%6]; 
C 
php > $dayToTest = new DateTime('2017-09-29'); 
php > echo $shiftOnDuty[$dayToTest->diff($startShiftA)->format('%d')%6]; 
A 
php > 
+0

完美!這就是我一直在尋找的。謝謝! – Chris

0

您可以使用算術。

從獲取當日差異開始。然後你想確定你到哪一天。對於這種使用模運算,經常與%mod()函數來完成:

select (case (current_date - '2017-09-23') % 6 
      when 0 then 'C' when 1 then 'C' 
      when 2 then 'A' when 3 then 'A' 
      when 4 then 'B' when 5 then 'B' 
     end) as shift 

的確切功能取決於數據庫,但是你應該能夠在任何數據庫來實現這一點。

+0

模數算術是我一直在尋找的。我曾嘗試過這種方式,但是經過幾個小時的拔毛,我不得不停下來。謝謝!! – Chris