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