我将课程存储在表格中。这些课每周重复一次,所以我只存储当天的索引(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)
答案 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 ;