1
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)

我想使用上表中的开始值和结束值计算(并更新)“持续时间”列。例如:

UPDATE break SET duration=TIMEDIFF(start, end) WHERE employee_id=1;

唉,这将持续时间列设置为 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)

帮助

4

2 回答 2

4

文档(强调我的):

TIMEDIFF() 返回 expr1 – expr2 表示为时间值

更改duration类型TIME,它应该可以工作。

请注意,您正在架构中创建冗余。这通常是一件坏事。如果endstart更改并且您不更新怎么办duration?更好地使用视图并从那里返回计算结果TIMEDIFFendstart

于 2013-08-06T15:23:24.653 回答
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 ;
于 2013-08-06T15:25:25.543 回答