0%

Mysql临时表使用实例

前文讲到无法解决限定日期内日程循环输出的问题,这里通过结合临时表,解决了。 因为我只要输出最近一周内的日程,所以,不用考虑周循环,和月循环,因为一个周循环的日程,不可能在一周内重复两次,月循环更不可能。这里只需要考虑日循环。 原理:临时生成一个表存储最近七天的日期,与route_data表一起查询,where条件为 ,临时表里的日期与日程下一次执行日期相同,如果是日循环的日程,直接与临时表里的日期自己对比,因为日循环的话,不用判断,每天都会执行。 完整的SQL:

create temporary table temp select date(now()) as newdate;
insert into temp (newdate) value (date_add(date(now()),interval 1 day));
insert into temp (newdate) value (date_add(date(now()),interval 2 day));
insert into temp (newdate) value (date_add(date(now()),interval 3 day));
insert into temp (newdate) value (date_add(date(now()),interval 4 day));
insert into temp (newdate) value (date_add(date(now()),interval 5 day));
insert into temp (newdate) value (date_add(date(now()),interval 6 day));

select * from temp t,route_data r where if(period=2,ADDDATE(CURDATE(),
-WEEKDAY(CURDATE())+if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),
if(period=0,data,if(period=1,newdate,if(DAYOFMONTH(CURDATE())<=data,
if(ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),
ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH),-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH ),
-DAYOFMONTH(CURDATE())+data)))))=newdate and if(period=2,ADDDATE(CURDATE(),
-WEEKDAY(CURDATE())+ if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),if(period=0,data,if(period=1,CURDATE(),
if(DAYOFMONTH(CURDATE())<=data,if(ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),ADDDATE(DATE_ADD(CURDATE(), 
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(), 
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data)))))<date_add(date(now()),interval 6 day);