2010-06-12 15 views
9

Bir MySQL veritabanında 12/24 saat (yani; 00:00) saatini depolamaya çalışıyorum. Şu anda zaman veri türünü kullanıyorum. Bu işe yarıyor ama saniyeler sütununa ekleme konusunda ısrar ediyor. Yani 09:20 giriyorsunuz ve saat 09:20 olarak saklanıyor. MySQL'de sadece 00:00 ile sınırlayabileceğim bir yol var mı?Saniye olmadan MySQL'de Time veri türünü kullanma

cevap

16

Bu mümkün görünmüyor. TIME veri tipi, 1 saniyelik bir çözünürlükle günün saatini (veya geçen süreyi) temsil edecek şekilde tanımlanmıştır. Ancak, her zaman bir SELECT sorgusunda HH:MM olarak alanını biçimlendirmek için DATE_FORMAT() işlevini kullanabilirsiniz: TIME column type

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

aralık veya hassas tanımlamak için herhangi bir parametreyi veya değiştirici kabul etmez. Bununla birlikte, dikkatli olmanız durumunda ekleri atlayabilirsiniz:

Bir TIME sütununa kısaltılmış değerler atamaya dikkat edin. MySQL , kısaltılmış TIME değerlerini günün saati olarak kolonlarla yorumlar. Yani, '11: 12 ', '11: 12: 00' anlamına gelir, '00: 11: 12 'değil. MySQL, en sağdaki hanesinin saniyelerle temsil edildiği varsayımıyla kısaltılmış değerlerini iki nokta üst üste ( ) gösterir. 12: 00' (11 saat sonra 12 dakika), ancak MySQL onları yorumlayan '00 olarak: 11: 12' (Örneğin, '11 anlamı olarak '1112' ve 1112 düşünebilirsiniz 11 dakika, 12 saniye). Benzer şekilde, '12' ve 12 '00: 00: 12 'olarak yorumlanır.

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

... ve belirterek, uygun bir TIME_FORMAT() uygulayarak (gerekirse) okuma bunları kaldırabilirsiniz: zaman değeri bir saat bölümünü içeren

Eğer bu 23'ten büyükse, % H ve% k saat formatı belirticileri, 0.123 olağan aralığından daha büyük bir değer üretir.

-- 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) 
); 
: Diğer saatlik biçim belirteçleri 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/sen de otomatik bir görüntüleme değerini almak için bir generated column kullanabilirsiniz 5.7.5 beri saat değer modülo üretmek