我写了一个触发器有时不执行
CREATE TRIGGER tri_mem_recover_date_add
BEFORE INSERT ON ac_flow_dispose_info
FOR EACH ROW begin
if(new.recover_date is not null ) THEN
if( UNIX_TIMESTAMP(new.recover_date)>=UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 08:30:00")) and UNIX_TIMESTAMP(new.recover_date)<=UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 17:30:00"))) then
set new.mem_recover_date=DATE_ADD(new.recover_date,INTERVAL -2 HOUR);
elseif(UNIX_TIMESTAMP(new.recover_date)<UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 08:30:00")))then
set new.mem_recover_date=CONCAT(date(DATE_SUB(new.recover_date,INTERVAL 1 DAY)),' 16:00:00');
else
set new.mem_recover_date=CONCAT(date(new.recover_date),' 16:00:00');
end if;
end if;
END;
CREATE TRIGGER tri_mem_recover_date
BEFORE UPDATE ON ac_flow_dispose_info
FOR EACH ROW begin
if(new.recover_date is not null && old.recover_date!= new.recover_date ) THEN
if( UNIX_TIMESTAMP(new.recover_date)>=UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 08:30:00")) and UNIX_TIMESTAMP(new.recover_date)<=UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 17:30:00"))) then
set new.mem_recover_date=DATE_ADD(new.recover_date,INTERVAL -2 HOUR);
elseif(UNIX_TIMESTAMP(new.recover_date)<UNIX_TIMESTAMP(CONCAT(DATE(new.recover_date)," 08:30:00")))then
set new.mem_recover_date=CONCAT(date(DATE_SUB(new.recover_date,INTERVAL 1 DAY)),' 16:00:00');
else
set new.mem_recover_date=CONCAT(date(new.recover_date),' 16:00:00');
end if;
end if;
END;
好像是mysql触发器的表名问题,可以试一试
问题找到了 old.recover_date!= new.recover_date 这个datetime类型的比较是不对的,转换为UNIX_TIMESTAMP 比较,同时要注意UNIX_TIMESTAMP(null)的情况要改成UNIX_TIMESTAMP(ifnull(),'')