大量的PHP / MySQL插入重叠时间

时间:2013-12-13 01:10:18

标签: php mysql

我正在为健身房制作这个软件,这个健身房的时间表重叠,如果课程结束时间和课程开始时间之间的时间超过35分钟,则该时间会被删除。

示例:我的工作时间为上午8:00至上午9:00,上午8:30至上午9:30,上午10:10至上午11:10。任何超过35分钟的差距都被认为是一个不同的转变。

我现在只针对每位员工处理薪酬报告。

问题是,他们希望在假期大规模登记每个人,我的大脑有点疯狂,试图找出如何对个别员工ID进行数组和循环,找出重叠,删除> 35分钟并将该班次插入check_ins表。

此时我已经隔离了给定假期的工作人员并按计划进行了调整,我在数组中有员工ID的总数以及数组中的总计划数。

任何人都知道如果不让我自己愚蠢,这怎么可能最容易实现? (如果健身房曾要求你编写调度软件,请运行!)

谢谢!

编辑:假日支付条件和friggin wind一样可变,所以没有帮助。

我的单个员工代码:

    //init our arrays
    $timeStart = array();
    $timeEnd = array();
    $x = 0;
    $maxInterval = new DateTime('00:35');
    $classIDArray = array();

    do {
//Get our start times for Monday
$p = new DateTime($row_GetMonSchedule2['Start_time']);
$q = new DateTime($row_GetMonSchedule2['End_time']);
$timeStart[$x] = $p->format('H:i');
$timeEnd[$x] =  $q->format('H:i');
//Get Class IDs
$classIDArray[$x] = $row_GetMonSchedule2['Class_ID'];

$totalEndTimes = count($timeEnd);
$x++;

} while ($row_GetMonSchedule2 = mysql_fetch_assoc($GetMonSchedule2));

//echo $totalRows_GetMonSchedule2;

//Now let's check the durations and make our shifts

//echo "Class ID Array: "; print_r($classIDArray);

$x = 0;
$s = 1;

do {
///First Time Start 
if ($x == 0) {
$TimeDayStart = $timeStart[$x];
}

if ($x < $totalEndTimes) {
///Last Time End
$TimeDayEnd = $timeEnd[$x]; 
}


  $x++; $s++;
} while ($x < $totalEndTimes);

$x = 0;
$s = 1;

/////Get Durations

$interval = array();


do {
 if ($x == 0) {
  //The very first end time
  //First end time of the first time block
  $firstEndTime = new DateTime($timeEnd[$x]); 
  $startTime = new DateTime($timeStart[$s]);
  $timeDiff = $startTime->diff($firstEndTime);
  $interval[$x] = $timeDiff->format('%H:%i');
 } else {
  //We don't need the last record because there isn't anything to calculate it aginst, so increase $x by one
  if ($x + 1 > $totalEndTimes) {



  } else {
    $endTime = new DateTime($timeEnd[$x]);
    $startTime = new DateTime($timeStart[$s]);
    $timeDiff = $endTime->diff($startTime);
    $interval[$x] = $timeDiff->format('%H:%i');

  }

 }



  $x++; $s++;

} while ($x < $totalEndTimes);

//Let's try to break this up into shifts now...
$x =0;
$y =0;
$zz = 1;
$s = 1;
$timeBreak =0;
$durCount = count($interval) - 1;
$BreakStartTimes = array();
$BreakEndTimes = array();
$xx3 = 0;
$yy3 = 0;

//Setup table
do {


  if ($x == 0) {
//echo $timeStart[$x]." - ";
$BreakStartTimes[$yy3] = $timeStart[$x];
$yy3++;
  if (new DateTime($interval[$x]) > new DateTime('00:35')) {
  //echo $timeEnd[$x]." ";
  $BreakEndTimes[$xx3] = $timeEnd[$x];
  $xx3++;
  $timeBreak = 1;
  //echo "Time Break";
  }

  } 
  if (new DateTime($interval[$x]) > new DateTime('00:35') && $timeBreak != 1) {
  //echo $timeEnd[$x]." ";
  $BreakEndTimes[$xx3] = $timeEnd[$x];
  $xx3++;
  $timeBreak = 1;
  //echo "Time Break";
  }

  if ($timeBreak == 1 && $x + 1 < $totalEndTimes) {
  //echo $timeStart[$s]." - ";
    $BreakStartTimes[$yy3] = $timeStart[$s];
    $yy3++;
  $timeBreak = 0;
  }


  $x++; $s++;

} while ($x < $totalEndTimes);

if (empty($BreakEndTimes)) {
  //echo "empty";
  $ttt = count($timeEnd) - 1;
  //echo $ttt;
}

1 个答案:

答案 0 :(得分:0)

就像一些评论者在我之前所说的那样,嵌套一些循环应该可以解决问题。尝试用伪代码写下来并从那里填写详细信息。

示例:

//connect to database
$conn = new mysqli("host","user","pass","db");

// check for connection error
if ($mysqli->connect_error) 
{
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

//query for all employees working the holiday
// I might be way off with the query seeing as I don't know the complexity
$sql = "SELECT e.ID, count(s.Start_Time) FROM employee e, schedule s 
        WHERE count(s.Start_Time) >= 1 AND e.ID = s.Employee_ID
            AND s.Start_Time >= '2013-12-24 00:00:00.0000' 
            AND s.End_Time <= '2014-01-02 00:00:00.0000'
        GROUP BY e.ID;";

//get the result from database like you do already

//then do the loop
for each employee 
{
    execute the code you have for the current employee
}
do clean up or other tasks after the loop is done

现在这很容易开始扩展,希望能够提出一个可以构建的想法。