2013-08-06 57 views
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) 

我想使用上表中的開始值和結束值計算(並更新)'duration'列。例如:動態更新數據庫列

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) 

幫助

+1

爲什麼要存儲兩次相同的信息?即您已經有開始和結束,爲什麼需要存儲差異?此外,您的「持續時間」欄不應該是日期時間,因爲它不是一個瞬間的時間。我可能會使用'int'並存儲秒數。 – leftclickben

回答

4

documentation(重點煤礦):

TIMEDIFF()返回expr1 - expr2表示爲時間值

變化duration鍵入TIME,它應該工作。

請注意,您正在架構中創建冗餘。這通常是一件壞事。如果endstart發生了變化,而您不更新duration?更好地使用視圖並返回從endstart計算出的TIMEDIFF

2

變化durration鍵入TIME,然後更新您的代碼

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

或者你會得到一個負durration

更新:在回答另一個答案你可以做一個觸發器,設置時間每該行更新的時間爲

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 ; 
+0

謝謝,我看不到樹木。 – cookie

+0

我的意圖是在表格中進行某種累積功能。比方說,在任何給定的日子裏,任何特定的用戶總結2,3或n。 – cookie