我花了數小時和無數頁的筆記本紙試圖弄清楚這一點。班次日曆 - 根據給定模式確定班次
我需要的是能夠找出什麼輪班值班的某一天,而不必手動輸入每年的所有班次。
消防部門的常見班次是48關閉24,但我們工作48關閉96。因此,給定一個開始日期,例如9-23-17,作爲CCAABB模式從那天開始C班的第一天,我該如何計算出哪個班次值班?換班時間並不重要,我只需要知道每天哪個班次。
我一直在拉我的頭髮,從我能想到的每一個角度來工作,但沒有找到解決方案。
我花了數小時和無數頁的筆記本紙試圖弄清楚這一點。班次日曆 - 根據給定模式確定班次
我需要的是能夠找出什麼輪班值班的某一天,而不必手動輸入每年的所有班次。
消防部門的常見班次是48關閉24,但我們工作48關閉96。因此,給定一個開始日期,例如9-23-17,作爲CCAABB模式從那天開始C班的第一天,我該如何計算出哪個班次值班?換班時間並不重要,我只需要知道每天哪個班次。
我一直在拉我的頭髮,從我能想到的每一個角度來工作,但沒有找到解決方案。
如果你只是需要在不使用數據庫來計算,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];
那最後一個襯墊有點拗口,所以一步一步,這是它做什麼:
$dayToTest->diff($startShiftA)->format('%d')
%6
$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 >
完美!這就是我一直在尋找的。謝謝! – Chris
您可以使用算術。
從獲取當日差異開始。然後你想確定你到哪一天。對於這種使用模運算,經常與%
或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
的確切功能取決於數據庫,但是你應該能夠在任何數據庫來實現這一點。
模數算術是我一直在尋找的。我曾嘗試過這種方式,但是經過幾個小時的拔毛,我不得不停下來。謝謝!! – Chris
用您正在使用的數據庫標記您的問題。 –