MySQL检索使用DAYOFWEEK存储的每周事件

时间:2013-12-24 17:29:18

标签: php mysql dayofweek

我将课程存储在表格中。这些课每周重复一次,所以我只存储当天的索引(0:星期日,1:星期一等等)

这是一个例子:(我的真实表有更多的列)

ID   NAME      DAY
1    English   1
2    Math      2
3    Physic    3

如果我想获得今天的课程,我可以寻找DAY = DAYOFWEEK(NOW())

的课程

现在我希望将所有课程从一个日期转到另一个日期,并且该范围可以超过一周。而且我需要得到与该课程相匹配的日期。

如果我从2013-12-23到2013-12-31寻找课程,我希望有类似的东西:

ID  NAME      DATE
1   English   2013-12-23
2   Math      2013-12-24
3   Physic    2013-12-25
1   English   2013-12-30
2   Math      2013-12-31

我最初的想法是在LESSONS.DAY = DAYOFWEEK(DATES.DATE)上加入一个包含该范围的所有日期的虚拟表到我的课程表,但我没想到如何做到这一点。

是否可以在mysql查询中执行此操作?我在PHP程序中使用它。

我已经在网上搜索了很多但我找不到那样的东西。

提前致谢。

PS:英语不是我的母语。

修改 这是我的实际查询。我可以获得范围内的课程,但它们是独一无二的,没有相应的日期。

SELECT * FROM Lessons
WHERE Day_Lesson > DAYOFWEEK(:datefrom) AND Day_Lesson < DAYOFWEEK(:dateto)

2 个答案:

答案 0 :(得分:0)

使用PHP创建一个包含时间范围内所有日期的虚拟表,使用UNION

$begin = new DateTime('2013-12-23');
$end = new DateTime('2014-01-01'); // DatePeriod is exclusive of end date
$interval = new DateInterval('P1D');
$period = new DatePeriod($begin, $interval, $end);

$sqlarray = array();
foreach ($period as $date) {
    $sqlarray[] = 'select "' . $date->format('Y-m-d') . '" AS date';
}
$union = implode(' UNION ', $sqlarray);
$sql = "SELECT *
        FROM ($union) AS d
        JOIN Lessons AS l
        ON DAYOFWEEK(d.date) = l.day";

答案 1 :(得分:0)

MySQL中的存储过程可以帮助您:

 delimiter $$
 create procedure getMyLessonCalendar(d0 date, d1 date)
 begin
     declare d date;
     drop table if exists temp_dates;
     create temporary table temp_dates (
         d date not null primary key,
         wd int not null,
         index idx_wd(wd)
     );
     set d = d0
     while d <= d1 do
         insert into temp_dates 
             values (d, weekday(d));
         set d = dateadd(d, interval +1 day);
     end while;
     select 
         l.id, l.name, a.d as `date`
     from
         lessons as l
         inner join temp_dates as a on l.weekday = a.wd;
 end $$
 delimiter ;