2010-06-12 38 views
9

Tôi đang cố gắng lưu trữ thời gian đồng hồ 12/24 giờ (ví dụ: 00:00) trong cơ sở dữ liệu MySQL. Hiện tại tôi đang sử dụng kiểu dữ liệu thời gian. Điều này hoạt động ok nhưng nó nhấn mạnh vào việc thêm giây vào cột. Vì vậy, bạn nhập 09:20 và nó được lưu trữ như 09:20:00. Có cách nào tôi có thể hạn chế nó trong MySQL chỉ 00:00?Sử dụng kiểu dữ liệu thời gian trong MySQL mà không cần giây

Trả lời

16

Điều đó không thể thực hiện được. Loại dữ liệu TIME được định nghĩa để biểu thị thời gian trong ngày (hoặc thời gian trôi qua) với độ phân giải 1 giây. Tuy nhiên, bạn luôn có thể sử dụng chức năng DATE_FORMAT() để định dạng lĩnh vực của bạn như HH:MM trong một truy vấn SELECT:

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

Các TIME column type không chấp nhận bất kỳ thông số hoặc sửa đổi để xác định phạm vi hoặc chính xác. Tuy nhiên, bạn có thể bỏ qua giây khi chèn nếu bạn cẩn thận:

Hãy cẩn thận khi gán giá trị viết tắt cho cột TIME. MySQL diễn giải các giá trị TIME được viết tắt bằng dấu hai chấm là thời gian trong ngày. Tức là, '11: 12 'có nghĩa là '11: 12: 00', không phải '00: 11: 12 '. MySQL giải thích giá trị viết tắt không có dấu hai chấm bằng cách sử dụng giả định rằng hai chữ số ngoài cùng bên phải đại diện cho giây (nghĩa là, thời gian trôi qua thay vì so với thời gian trong ngày). Ví dụ: bạn có thể nghĩ đến '1112' và 1112 như ý nghĩa '11: 12: 00 '(12 phút sau 11 giờ), nhưng MySQL diễn giải chúng là '00: 11: 12' (11 phút, 12 giây). Tương tự, '12' và 12 được hiểu là '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 | 
+------------+-----------+ 

... và bạn có thể loại bỏ chúng vào đọc (nếu cần thiết) bằng cách áp dụng một hợp TIME_FORMAT(), lưu ý rằng:

Nếu giá trị thời gian chứa một phần giờ đó lớn hơn 23, các thông số định dạng % H và% k giờ tạo ra một giá trị lớn hơn phạm vi thông thường là 0,23. Định dạng giờ specifiers khác sản xuất các giờ giá trị modulo 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 | 
+------------+---------+ 

Kể từ MySQL/5.7.5 bạn cũng có thể sử dụng một generated column để có được một giá trị hiển thị tự động:

-- 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) 
); 
Các vấn đề liên quan