2010-06-12 6 views
9

Próbuję przechowywać 12/4 24 godziny (tj. 00:00) czasu zegarowego w bazie danych MySQL. W tej chwili używam datatypu czasu. Działa to dobrze, ale nalega na dodanie sekund do kolumny. Wprowadzasz więc 09:20 i jest on przechowywany jako 09:20:00. Czy jest jakiś sposób mogę ograniczyć go w MySQL do 00:00?Użycie Typ danych Time w MySQL bez sekund

Odpowiedz

16

To nie wygląda na możliwe. Typ danych TIME jest zdefiniowany jako reprezentujący czas dnia (lub czas, który upłynął) z 1 sekundową rozdzielczością. Jednak zawsze można skorzystać z funkcji DATE_FORMAT() sformatować boiska HH:MM w SELECT zapytania:

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 nie przyjmuje żadnych parametrów lub modyfikator do zdefiniowania zakresu lub precyzji. Możesz jednak pominąć sekundy na wstawianiu, jeśli zachowasz ostrożność:

Uważaj na przypisywanie skróconych wartości do kolumny CZAS. MySQL interpretuje skrócone wartości TIME z dwukropkami jako porą dnia. To znaczy, '11: 12 'oznacza '11: 12: 00', a nie '00: 11: 12 '. MySQL interpretuje skrócone wartości bez dwukropków przy założeniu, że dwie ostatnie cyfry reprezentują sekundy (tj. Jako czas, który upłynął, a nie niż jako pora dnia). Na przykład, można by pomyśleć o '1112' i 1112 w ten sposób, '11: 12: 00' (12 minut po godzinie 11), ale MySQL interpretuje je jako '00: 11: 12' (11 minut, 12 sekund). Podobnie, "12" i 12 są interpretowane jako "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 | 
+------------+-----------+ 

... i można je usunąć na read (jeśli to konieczne) przez zastosowanie odpowiedniej TIME_FORMAT(), zauważając, że:

Jeśli wartość czasu zawiera część godzinny że jest większa niż 23, specyfikatory formatu godzin i% k godzin produkują wartość większą niż zwykły zakres 0,22. Pozostałe Specyfikatory formatu godziny wytwarzają wartość modulo godzin 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 | 
+------------+---------+ 

Ponieważ MySQL/5.7.5 można również użyć generated column aby uzyskać wartość wyświetlacz automatycznie:

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