2015-09-13 3 views
1

Привет У меня есть задание из колледжа, чтобы сделать каникулы в каникулах. Я должен выпустить праздничные дни в эквивалентном месяце и году.Дата Диапазон за разные годы и месяцы

Тестовые данные: Джон Смит Дата начала 28.12.2015 Дата окончания 2.1.2016

Я могу выход, используя дату начала: 2015 декабрь, джон Смит 28.12.2015 окончание 2.1.2016

но Мне также нужно эти данные, чтобы быть в

2016 January john smith 28.12.2015 ending 2.1.2016 

потому что праздник начнется в декабре 2015 года и завершится в январе 2016 года,

$sql = "SELECT DATE_FORMAT(datestart, '%M') as month, 
       DATE_FORMAT(dateEnd, '%M') as monthe, 
       MONTH(datestart) AS m, 
       MONTH(dateEnd) AS e,YEAR(datestart) AS year, 
       holiday.Id, employeeId, datestart,dateEnd, 
       DATE_FORMAT(holiday.dateEnd,'%D %M, %Y') AS end,   
       DATE_FORMAT(holiday.datestart,'%D %M, %Y') AS startit, 
       CONCAT(employees.empFirst,' ',employees.empLast) AS employee, 
       DATE_FORMAT(holiday.datestart,'%d-%m-%Y %H:%i') AS start From holiday 
     LEFT JOIN employees ON holiday.employeeId = employees.empId ORDER BY datestart "; 

$result = $mysqli->query($sql); 
$result1 = $mysqli->query($sql); 
$year = array(); 
$monthx = array('January', 'February', 'March', 'April', 'May', 
       'June', 'July', 'August', 'September', 'October', 
       'November', 'December'); 

while ($row = mysqli_fetch_assoc($result)) { 
    $year = $row['year']; 
    $month = $row['month']; 
    $monthe = $row['monthe']; 
    $years[$year][$month][] = $row; 
    //print_r($something); 
} 

foreach($years as $year => $months) { 
    echo '<b>Year &nbsp;'.$year. '</b><br>'; 

    foreach ($monthx as $month) { 
     echo '<b>'.$month. '</b><br>'; 
     if (isset($months[$month])) 
     { 
      foreach($months[$month] as $item) { 
       echo $item['employee']. '&nbsp;-&nbsp;' .$item['startit'].'&nbsp;-&nbsp;'.$item['end'].'<br/>'; 
      } 
     }else{ 
      echo 'No Holidays Booked<br/>'; 
     } 
    } 
} 

Как включить дату окончания, так что праздник распространяется, например. дата начала 28.12.2015 дата окончания 2.1.2016 будет в каждом из требуемого года и месяца.

+0

Вы действительно не делаете большую часть этой домашней работы самостоятельно, вы сами !!!! – RiggsFolly

+0

@RiggsFolly OK Я получаю вашу мысль. сожалею –

ответ

0

Я не уверен, что есть много четких и простых записей, доступных при обработке даты в базах данных. Там есть PDF-версия книги профессора Снодграсса. Это довольно ясно, но не просто. http://www.cs.arizona.edu/~rts/publications.html

У вас есть два диапазона дат: a: astart - aend и b: bstart - изгиб.

Если вы хотите знать, если б это собственное подмножество а, логика такова:

bstart >= astart AND bend <= aend 

Если вы хотите знать, если б и не перекрываются, то логика в этом

bstart > aend OR astart > bend 

Тогда вам просто нужна хорошая старая дата SQL арифметика ....

WHERE holiday.start >= person.start /* holiday subset of person dates */ 
    AND holiday.start <= person.end 

И, если диапазон overl человека aps диапазон отдыха,

WHERE NOT (holiday.start > person.end OR person.start > holiday.end) 
Смежные вопросы