Даты MySQL между датой начала и окончания события

Я работаю над PHP и MySQL. Вы можете создавать в нем события, делать оговорки и т.д. Предположим, у меня есть таблица MySql:

--table 'events'
+------+---------------------+---------------------+
| name | startdate | enddate |
+------+---------------------+---------------------+
| aaa | 2014-10-28 00:00:00 | 2014-10-28 23:59:59 |
| bbb | 2015-01-01 10:00:00 | 2015-01-01 16:00:00 |
| ccc | 2014-12-24 17:00:00 | 2014-12-28 08:30:30 |
+------+---------------------+---------------------+

Мне нужно получить все даты, где происходят события. Итак, для событий, которые начинаются и заканчиваются в тот же день, я хотел бы получить единую дату, а для нескольких дней я хотел бы получить дату начала, а затем даты до конца. Итак, ожидаемый результат будет выглядеть так:

+------------+
| dates |
+------------+
| 2014-10-28 |
| 2015-01-01 |
| 2014-12-24 |
| 2014-12-25 |
| 2014-12-26 |
| 2014-12-27 |
| 2014-12-28 |
+------------+

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

Заранее благодарю за любую помощь.

EDIT: причина этого заключается в том, чтобы показать, в какие дни есть события в календаре.

3 ответа

$getEvents = mysqli_query("SELECT ...... You query");
$row_getEvents = mysqli_fetch_assoc($getEvents);

do {
 $date = date("Y-m-d", strtotime($row_getEvents['startdate']));
 $end_date = date("Y-m-d", strtotime($row_getEvents['enddate']));

 while (strtotime($date) <= strtotime($end_date)) {
 echo "$date\n";
 $date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
 }
} while ($row_getEvents = mysqli_fetch_assoc($getEvents));


Создайте таблицу всех дат, например:

CREATE TABLE datelist (DATE DATETIME NOT NULL PRIMARY KEY);
INSERT INTO datelist VALUES ('1950-01-01');
INSERT INTO datelist VALUES ('1950-01-02');
INSERT INTO datelist VALUES ('1950-01-03');
INSERT INTO datelist VALUES ('1950-01-04');

Затем соедините таблицу событий с этой таблицей, используя этот запрос:

SELECT datelist.date
FROM datelist
INNER JOIN events ON datelist.date BETWEEN date(startdate) AND date(enddate)

NB: Я не проверял случаи краев.


SELECT name 
FROM events 
WHERE start BETWEEN ' 2014-10-28' AND '2014-10-28'

попробуй это

licensed under cc by-sa 3.0 with attribution.