2010-06-12 23 views
9

我試圖在MySQL數據庫中存儲12/24小時(即; 00:00)的時間。目前我正在使用時間數據類型。這工作正常,但它堅持要添加列的秒。因此,您輸入09:20並將其存儲爲09:20:00。有沒有什麼辦法可以在MySQL中將它限制在00:00?在MySQL中使用時間數據類型(無秒)

回答

16

這看起來不可能。數據類型TIME定義爲用1秒的分辨率表示一天中的時間(或經過的時間)。但是,你可以隨時使用DATE_FORMAT()功能在SELECT查詢您的字段格式爲HH:MM

SELECT DATE_FORMAT(NOW(), '%k:%i'); 
+-----------------------------+ 
| DATE_FORMAT(NOW(), '%k:%i') | 
+-----------------------------+ 
| 4:09      | 
+-----------------------------+ 
1 row in set (0.00 sec) 


SELECT DATE_FORMAT(NOW(), '%H:%i'); 
+-----------------------------+ 
| DATE_FORMAT(NOW(), '%H:%i') | 
+-----------------------------+ 
| 04:09      | 
+-----------------------------+ 
1 row in set (0.00 sec) 
1

TIME column type不接受任何參數或修改定義的範圍或精度。但是,如果您注意,可以省略秒數插入:

請注意將縮略值分配給TIME列。 MySQL 將含有冒號的縮寫TIME值解釋爲一天中的時間。 也就是說,'11:12'表示'11:12:00',而不是'00:11:12'。 MySQL使用假設兩個 最右邊的數字表示秒(也就是說,經過時間而不是一天的時間)來解釋 的縮寫值。例如,你可能會想到'1112' 和1112 的含義'11:12:00' (11點後12分鐘),但MySQL的 它們解釋爲'00:11:12'( 11分鐘,12秒)。類似地, '12'和12被解釋爲'00:00:12'。

CREATE TABLE example (
    example_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    elapsed TIME NOT NULL, 
    PRIMARY KEY (example_id) 
); 
INSERT INTO example (elapsed) VALUES ('123:45:00'), ('123:45'); 
SELECT * FROM example; 
+------------+-----------+ 
| example_id | elapsed | 
+------------+-----------+ 
|   1 | 123:45:00 | 
|   2 | 123:45:00 | 
+------------+-----------+ 

...你可以通過應用適當的TIME_FORMAT()上讀取刪除它們(如果需要),並指出:

如果時間值包含一個小時一部分大於23,則 %H和%k小時格式說明符會生成大於通常的0-23的 範圍的值。另一個小時格式說明符產生小時 值模12

INSERT INTO example (elapsed) VALUES ('2:00'); 
SELECT example_id, TIME_FORMAT(elapsed, '%k:%i') AS elapsed 
FROM example; 
+------------+---------+ 
| example_id | elapsed | 
+------------+---------+ 
|   1 | 123:45 | 
|   2 | 123:45 | 
|   3 | 2:00 | 
+------------+---------+ 

從MySQL/5.7.5你也可以使用一個generated column獲得自動的顯示值:

-- Completely untested, I don't have 5.7 yet 
CREATE TABLE example (
    example_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    elapsed TIME NOT NULL, 
    -- Size to accomodate for '-838:59:59' 
    elapsed_display VARCHAR(10) AS (TIME_FORMAT(elapsed, '%k:%i')) VIRTUAL NOT NULL, 
    PRIMARY KEY (example_id) 
);