班次日历 - 根据给定的模式确定班次

时间:2017-09-25 01:43:32

标签: php mysql sql

我花了几个小时和无数页笔记本纸试图解决这个问题。

我需要的是能够找出某一天的值班班次,而无需手动输入每年的所有班次。

消防部门的常见班次是24小时48分,但我们在96分钟工作48。所以考虑到一个开始日,例如9-23-17,作为从那天开始的CCAABB模式的C班的第一天,我怎样才能确定哪个班次值班?换班时间并不重要,我只需要知道每天的班次。

从我能想到的每一个角度来看,我一直把头发拉出来但却没有找到解决办法。

2 个答案:

答案 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];

最后一个班轮有点拗口,所以一步一步,这就是它的作用:

  1. 查找天数差异:$dayToTest->diff($startShiftA)->format('%d')
  2. 找出模数(余数除以天数除以6):%6
  3. 这产生了[0-5]范围内的数字。 [0-1]是移位A,[2-3]是移位B,[4-5]是移位C.
  4. 使用此号码作为$shiftOnDuty
  5. 的索引

    示例运行:

    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 >