Диапазон дат за разные годы и месяцы

Привет, у меня есть задание из колледжа, связанное с выходными днями для персонала. Я должен вывести выходные в соответствующем месяце и году.

Тестовые данные:
Джон Смит дата начала 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 будет в каждом необходимом году и месяце.

1

Решение

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

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

Если вы хотите знать, является ли b правильным подмножеством a, логика такова:

 bstart >= astart   AND   bend <= aend

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

bstart > aend  OR astart > bend

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

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

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

 WHERE NOT (holiday.start > person.end OR person.start > holiday.end)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]