前言
今天有同学过来问我MYSQL的存储过程怎么写,我按我的经验写好了,CALL一下,也正确。
于是他问了下上次没解决的触发器怎么做?我就思考了一番:觉得可以先试试上次写了1个半小时的方法。
上一次的MYSQL代码
--- 触发器:实现插入开始时间和结束时间自动生成运行时间
delimiter ;;
CREATE TRIGGER `insertTraininfo` BEFORE INSERT ON `traininfo` FOR EACH ROW BEGIN
DECLARE CURTIME DATETIME;
SELECT NEW.TrainEndTime - NEW.TrainStartTime INTO CURTIME FROM traininfo WHERE TrainNo=new.TrainNo LIMIT 1;
SET NEW.trainRunningTime = CURTIME;
end
;;
delimiter ;
经过测试,发现可以生成该触发器,也可以插入数据,但无法触发这个触发器,或者说,是触发器没有实现。
回过头看,我发现直接NEW.TrainEndTime - NEW.TrainStartTime是等于0的,也就是说之前没有实现是这个原因。
于是我们去网上找怎么把DATETIME差值转换成DATETIME。未果,倒是发现了一个UNIX_TIMESTAMP(),可以将任何时间类型转换成秒。
由于trainRunningTime 是DATETIME类型,所以转换失败。于是我决定把运行时间设置为TIME。
这时同学发现了可以在转换成秒的情况下,将其转换成TIME类型,机制的他决定用之前那个UNIX_TIMESTAMP(),而不是刚刚才找到的SEC_TO_TIME(),当然了,刚刚找到的 秒转时间 也是解决问题的关键,他这一点做得很不错,可以说,在我百度找到可用的函数时,我并没有实在地判断该函数有什么用,只是单纯以为套进去试试就应该可以。
DROP TRIGGER IF EXISTS `insertTraininfo`;
delimiter ;;
CREATE TRIGGER `insertTraininfo` BEFORE INSERT ON `traininfo` FOR EACH ROW BEGIN
SET NEW.TrainRunningTime = SEC_TO_TIME(UNIX_TIMESTAMP(NEW.TrainEndTime) - UNIX_TIMESTAMP(NEW.TrainStartTime ));
end
;;
delimiter ;
两个DATETIME的差值如何赋值给TIME类型(转成TIME类型)
TIME = SEC_TO_TIME(UNIX_TIMESTAMP(TIME2)- UNIX_TIMESTAMP(TIME1));