2015-09-26 1 views
-2

У меня есть таблица базы данных, в которой оставить будет обновляться.Вычислить листья из таблицы для более чем 1 оставить запись

Он имеет следующие столбцы:

id | empno | startdate | enddate | status | duration 

Теперь я должен рассчитать отпуск в определенный месяц и год, где месяц и год будет поступать из пользовательского ввода. У меня есть код, который будет получать no. листьев в данном месяце, если запись о пребывании равна 1.

Проблема в том, что если пользователь ушел более одного раза, функция вычисляет только последнюю строку из базы данных. Любая помощь будет оценена по достоинству.

<?PHP 
$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "lms"; 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
$empid = (isset($_POST['empid']) ? $_POST['empid'] : ''); 
$month = (isset($_POST['month']) ? $_POST['month'] : ''); 

$month = "2015-sep"; 

$month1 = date('F', strtotime('$month')); 
//echo $month1; 

$year = date('Y',strtotime('$month')); 

$monthStart = date("Y-m-1") . "<br/>"; 
$num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y")); 
$monthEnd = date("Y-m-".$num)."<br/>"; 
//echo "$num"; 
$months = date('M'); 
$years = date ('Y'); 
$leave = 0; 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "SELECT `startdate`, `enddate`,`duration` FROM `leaves` WHERE `employee` = '2' AND `status` = '3' 
AND `startdate` > '01-09-2015' AND `enddate` < '30-09-2015' "; 

$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     $start = ($row['startdate']); 
     $end = ($row['enddate']); 
     $startcount = ['COUNT(`employee`)']; 
     //$durationlvs = ($row['duration']); 
      echo "sdate:$start,edate:$end</br>"; 
      //echo "lvsdur:$durationlvs"; 
    } 

    function getLeavesInPeriod($start, $end) { 
     $date = new DateTime($start); 
     $endDate = new DateTime($end); 
     $leaves = array(); 

     while($date <= $endDate) { 
      $year = $date->format('Y'); 
      $month = $date->format('M');   

      if(!array_key_exists($year, $leaves)) 
       $leaves[$year] = array(); 
      if(!array_key_exists($month, $leaves[$year])) 
       $leaves[$year][$month] = 0; 

      $leaves[$year][$month]++;   
      $date->modify("+1 day"); 
     } 
    return $leaves; 
} 
$leaves = getLeavesInPeriod($start,$end); 
$noofleaves=$leaves[$years][$months]; 
echo $noofleaves; 
$conn->close(); 
} 
?> 
+2

Вы можете предоставить немного больше своего кода, если это возможно. Я знаю, что вы показали много, но немного больше – Drew

+0

@Drew Вот код ..... –

ответ

1

Просто изменил SQL-запрос к

$ SQL = «SELECT SUM (DATEDIFF (МИНИМУМ (EndDate, '2015-09-30'), НАИБОЛЬШИЙ (StartDate,«2015-09 -01 ')) + 1) дней ОТ листьев ГДЕ начальная дата < =' 2015-09-30 'AND enddate> =' 2015-09-01 'AND employee =' 2 ' AND status =' 1 '";

ufff !!! получил результат.

Смежные вопросы