0

我有一个事件表,每个事件都有一个开始日期和一个结束日期。

我需要显示日期列表并显示每天发生的事件。

例如,假设我有一个运行 mon-wed 的事件和另一个运行 tues-thurs 的事件,我正在尝试创建一个像这样的表:

Mon: Event 1
Tue: Event 1, Event 2
Wed: Event 1, Event 2
Thu: Event 2

我能看到的唯一方法是每天运行一个查询,或者加载给定日期范围内的所有事件,然后如果它们持续超过一天,则将它们复制到我的代码中。这两种方法看起来都很老套,我敢肯定我错过了一些东西。

有没有更简洁的方法来做到这一点?

结构:

id         INT
name       VARCHAR
start_date DATE
end_date   DATE

当前查询(略微简化,因为此数据库结构令人震惊):

SELECT *
FROM events
WHERE start_date <= $somedate
AND end_date >= $somedate

...其中 $somedate 是给定的日期。(是的,我在我的代码中正确地转义了它!)

4

4 回答 4

1

可能有更好的方法,但在我脑海中,我会说创建一个可能的日期表,然后简单地

select * from events
 inner join possibleDates on possibleDates.Date >= start_date and possibleDates.Date <= end_date
于 2013-08-29T13:58:56.273 回答
1

首先,您可能必须获取每个事件的 start_date 和 end_date 之间的所有日期。放入温度。表如:

|Weekday| Event_name|
|Mo     | Event1    |
|Tu     | Event1    |
|We     | Event1    |
|We     | Event2    |
|Th     | Event2    |
|Fr     | Event2    |

然后在工作日按 group_concat 分组事件。

此链接将帮助您获取每个事件的开始日期和结束日期之间的日期。: 获取两个日期之间的日期列表

于 2013-08-29T13:53:46.230 回答
1

如果必须,您可以在一个查询中完成,但我建议您像 Jan Zeiseweis 也建议获得一个工作日表。工作 SQLfiddle:http ://www.sqlfiddle.com/#!2/e618d9/1/0

SELECT wk.day, GROUP_CONCAT(e.name, '') events
FROM (
  SELECT 'Monday' day, 0 dayIndex
    UNION
  SELECT 'Tuesday' day, 1 dayIndex
    UNION
  SELECT 'Wednesday' day, 2 dayIndex
    UNION
  SELECT 'Thursday' day, 3 dayIndex
    UNION
  SELECT 'Friday' day, 4 dayIndex
    UNION
  SELECT 'Saturday' day, 5 dayIndex
    UNION
  SELECT 'Sunday' day, 6 dayIndex
) wk
LEFT JOIN Events e
   ON WEEKDAY(e.start) <= wk.dayIndex
  AND WEEKDAY(e.end) >= wk.dayIndex
GROUP BY wk.day ORDER BY wk.dayIndex
于 2013-08-29T15:37:06.753 回答
1

选择特定日期范围内的事件(我假设特定月份)。然后循环该月的日子,并有另一个内部循环显示该日期发生的任何事件。

<?php
$events = getEvents(); // some function that returns events from database

echo '<ol class="calendar">';
for ($i = 1; $i <= cal_days_in_month(); $i++) {
    echo '<li>';

    $beginning = mktime(0, 0, 0, date('n'), $i, date('Y'));
    $end = mktime(23, 59, 59, date('n'), $i, date('Y'));
    $events_on_day = array();

    foreach ($events as $event) {
        if ($event->start_date <= $end && $event->end_date >= $beginning) {
            $events_on_day[] = $event;
        }
    }

    if ($events_on_day > 0) {
        echo '<ul>';
        foreach ($events_on_day as $event_on_day) {
            echo '<li>' . $event_on_day->name . '</li>';
        }
        echo '</ul>';
    }
}
echo '</ol>';
?>
于 2013-08-29T14:04:21.720 回答