我花了几个小时和无数页笔记本纸试图解决这个问题。
我需要的是能够找出某一天的值班班次,而无需手动输入每年的所有班次。
消防部门的常见班次是24小时48分,但我们在96分钟工作48。所以考虑到一个开始日,例如9-23-17,作为从那天开始的CCAABB模式的C班的第一天,我怎样才能确定哪个班次值班?换班时间并不重要,我只需要知道每天的班次。
从我能想到的每一个角度来看,我一直把头发拉出来但却没有找到解决办法。
答案 0 :(得分: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
确切的函数取决于数据库,但您应该能够在任何数据库中实现它。
答案 1 :(得分:0)
如果您只需要在不使用数据库的情况下进行计算,那么PHP的DateTime函数将完成任务:
// 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 >