mysql> describe break;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| start | datetime | YES | | NULL | |
| end | datetime | YES | | NULL | |
| duration | datetime | YES | | NULL | |
| date | datetime | YES | | NULL | |
| employee_id | int(11) | NO | MUL | NULL | |
+-------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
我想使用上表中的起始值和结束值计算(并更新)'duration'列。例如:
UPDATE break SET duration=TIMEDIFF(start, end) WHERE employee_id=1;
唉,这会将duration列设置为0000-00-00 00:00:00
mysql> select * from break\G;
*************************** 1. row ***************************
id: 30
start: 2013-08-06 15:43:17
end: 2013-08-06 15:55:42
duration: 0000-00-00 00:00:00
date: 2013-08-06 15:43:17
employee_id: 1
1 row in set (0.00 sec)
帮助
答案 0 :(得分:4)
来自documentation(强调我的):
TIMEDIFF()返回expr1 - expr2,表示为时间值。
将duration
更改为TIME
类型,它应该有效。
请注意,您正在架构中创建冗余。这通常是一件坏事。如果end
或start
发生更改且您未更新duration
该怎么办?更好地使用视图并返回从TIMEDIFF
和end
计算的start
。
答案 1 :(得分:2)
将durration
更改为TIME
,然后更新您的代码
UPDATE break SET duration=TIMEDIFF(end, start) WHERE employee_id=1;
或者你会得到负面的刺激
更新:在回答另一个答案时,您可以设置一个触发器,每次更新行时设置持续时间
DROP TRIGGER IF EXISTS `break_trigger`;
DELIMITER //
CREATE TRIGGER `break_trigger` AFTER UPDATE ON `break`
FOR EACH ROW BEGIN
SET duration=TIMEDIFF(end, start) WHERE employee_id= NEW.employee_id;
END
//
DELIMITER ;