又要麻烦老大了,现在需求有变化,我的jz_business_plan表的描述如下:CREATE TABLE `jz_business_plan` (
`gp_id` int(10) unsigned NOT NULL auto_increment,
`g_id` int(11) unsigned default NULL,
`account_id` int(11) unsigned default NULL,
`plandate` timestamp NOT NULL default CURRENT_TIMESTAMP,
`re` varchar(255) default NULL,
`gb_id` int(10) unsigned default NULL,
PRIMARY KEY (`gp_id`),
KEY `g_id` (`g_id`),
CONSTRAINT `jz_business_plan_ibfk_3` FOREIGN KEY (`g_id`) REFERENCES `jz_gbmes` (`g_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;在另一张表jz_gbmes中包含业务信息,提醒种类,开始时间和截止时间等,如果是按月提醒,我需要判断当前日和起始时间截止时间的大小,如果在其中插入,如果是按年则需要判断月和日,我需要根据jz_business_plan表中的plandate来判断是否是当前月和日,如果不是,按月提醒每个月只生成一条记录,存储过程如下:SELECT max(plandate) into business_date from jz_business_plan;
set mon = month(business_date);
set ye = year(business_date);
set de = dayofmonth(business_date);
if (ye = year(now())) then
WHILE (mon <= month(now())) do
insert into jz_business_plan(g_id,gb_id,account_id) SELECT a.g_id,a.gb_id,a.account_id from jz_gbmes a left join jz_business_plan b on a.g_id = b.g_id where (((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())) or ((a.remindtype = 0) and ((a.stmonth <= mon) and (a.endmonth >= mon) and (a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())))) or ((a.remindtype = 1) and (a.stday <= dayofmonth(now()) and dayofmonth(now())) and (((mon+1)=1) or ((mon+1)=4) or ((mon+1)=7) or ((mon+1)=10)))) and b.g_id is null;
set mon = mon+1;
end WHILE; 现在需要每次插入的时候也要将plandate赋值为当时的年月,即取得mon和当时的年插入,plandate为time_stamp类型,我用insert select形式还可以么?谢谢
`gp_id` int(10) unsigned NOT NULL auto_increment,
`g_id` int(11) unsigned default NULL,
`account_id` int(11) unsigned default NULL,
`plandate` timestamp NOT NULL default CURRENT_TIMESTAMP,
`re` varchar(255) default NULL,
`gb_id` int(10) unsigned default NULL,
PRIMARY KEY (`gp_id`),
KEY `g_id` (`g_id`),
CONSTRAINT `jz_business_plan_ibfk_3` FOREIGN KEY (`g_id`) REFERENCES `jz_gbmes` (`g_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;在另一张表jz_gbmes中包含业务信息,提醒种类,开始时间和截止时间等,如果是按月提醒,我需要判断当前日和起始时间截止时间的大小,如果在其中插入,如果是按年则需要判断月和日,我需要根据jz_business_plan表中的plandate来判断是否是当前月和日,如果不是,按月提醒每个月只生成一条记录,存储过程如下:SELECT max(plandate) into business_date from jz_business_plan;
set mon = month(business_date);
set ye = year(business_date);
set de = dayofmonth(business_date);
if (ye = year(now())) then
WHILE (mon <= month(now())) do
insert into jz_business_plan(g_id,gb_id,account_id) SELECT a.g_id,a.gb_id,a.account_id from jz_gbmes a left join jz_business_plan b on a.g_id = b.g_id where (((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())) or ((a.remindtype = 0) and ((a.stmonth <= mon) and (a.endmonth >= mon) and (a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())))) or ((a.remindtype = 1) and (a.stday <= dayofmonth(now()) and dayofmonth(now())) and (((mon+1)=1) or ((mon+1)=4) or ((mon+1)=7) or ((mon+1)=10)))) and b.g_id is null;
set mon = mon+1;
end WHILE; 现在需要每次插入的时候也要将plandate赋值为当时的年月,即取得mon和当时的年插入,plandate为time_stamp类型,我用insert select形式还可以么?谢谢
当时的年:YEAR(NOW())
在SELECT 语句中加入即可,明日再具体看看,现在要出去。
SELECT a.g_id,a.gb_id,a.account_id from jz_gbmes-》
SELECT a.g_id,a.gb_id,a.account_id from jz_gbmes,MON,YEAR(NOW()).....
这样不行啊。
2、如是jz_business_plan表,
insert into jz_business_plan(g_id,gb_id,account_id,plandate,f1,f2) SELECT a.g_id,a.gb_id,a.account_id,MON,Year(now()) from jz_gbmes a
`plandate` timestamp NOT NULL default CURRENT_TIMESTAMP,以前插入的时候都是让它默认为当前时间,现在需要将它改为插入时的时间,如果在当月的时候再次调用这个存储过程,如果是该月已经存在g_id了就不再插入了。
CAST(
CONCAT(YEAR(NOW()),@MON,DAY(NOW())) AS DATE )
CONCAT(YEAR(NOW()),@MON,DAY(NOW())) AS DATE )) from jz_gbmes a
CONCAT(YEAR(NOW()),@MON,DAY(NOW())) AS DATE ) 如果是09年的话,在查08年的业务,这个时间就不对了。
set de = dayofmonth(business_date);
中的ye如何?你可以根据上述示例自行修改一下。
是 set ye = year(business_date);
中的YE
CONCAT(YE,MON,DAY(NOW())) AS DATE )
where (((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())) or ((a.remindtype = 0) and ((a.stmonth <= mon) and (a.endmonth >= mon) and (a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())))) or ((a.remindtype = 1) and (a.stday <= dayofmonth(now()) and dayofmonth(now())) and (((mon+1)=1) or ((mon+1)=4) or ((mon+1)=7) or ((mon+1)=10)))) and b.g_id is null;该怎么修改呢?谢谢!
select round(datediff('2009-02-01','2008-11-01' )/30)
DATE_ADD(date,INTERVAL 1 MONTH),
进行循环就可以了,直接在WHERE中加入日期=循环日期
declare ff1 date;
declare ff2 date;
set ff1='2009-01-01';
set ff2='2008-11-01';
while ff2<=ff1 do
INSERT INTO LSBRQ VALUES(FF2);
set ff2=date_add(ff2,INTERVAL 1 month);
END WHILE;
insert into jz_business_plan(g_id,gb_id,account_id,plandate) SELECT a.g_id,a.gb_id,a.account_id,CAST(
CONCAT(ye,mon,DAY(NOW())) AS DATE ) from jz_gbmes a left join jz_business_plan b on a.g_id = b.g_id where (((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())) or ((a.remindtype = 0) and ((a.stmonth <= mon) and (a.endmonth >= mon) and (a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())))) or ((a.remindtype = 1) and (a.stday <= dayofmonth(now()) and dayofmonth(now())) and ((mon=1) or (mon=4) or (mon=7) or (mon=10)))) and b.g_id is null; 哪么插入一次后第二个月b.g_id is null就不会再插入了,如果我把他去掉,哪么一个月中将会有好几次插入数据库,而需要只插入一次。
declare ff1 date;
declare ff2 date;
set ff1='2009-01-01';
set ff2='2008-11-01';
while ff2 <=ff1 do
INSERT INTO LSBRQ VALUES(FF2);
set ff2=date_add(ff2,INTERVAL 1 month);
END WHILE;
插入,在条件中直接加入年月的判断。
CONCAT(ye,mon,DAY(NOW())) AS DATE ) from jz_gbmes a where (((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())) or ((a.remindtype = 0) and ((a.stmonth <= mon) and (a.endmonth >= mon) and (a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now())))) or ((a.remindtype = 1) and (a.stday <= dayofmonth(now()) and dayofmonth(now())) and ((mon=1) or (mon=4) or (mon=7) or (mon=10)))); 这样的话会生成很多
(((a.remindtype = 2) and a.stday <= dayofmonth(now()) and a.enday >= dayofmonth(now()))这个时间段的重复的数据,我只要生成一条就行了。