mysql 触发器出现问题_MYSQL写触发器遇到的问题

前言

今天有同学过来问我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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值