2010-06-12 9 views
9

Estoy tratando de almacenar un reloj de 12/24 horas (es decir, 00:00) en una base de datos MySQL. En este momento estoy usando el tipo de datos de tiempo. Esto funciona bien pero insiste en agregar los segundos a la columna. Entonces ingresa a las 09:20 y se almacena a las 09:20:00. ¿Hay alguna manera de limitarlo en MySQL a solo 00:00?Usar el tipo de datos de tiempo en MySQL sin segundos

Respuesta

16

Eso no parece posible. El tipo de datos TIME se define para representar la hora del día (o el tiempo transcurrido) con una resolución de 1 segundo. Sin embargo, siempre se puede utilizar la función DATE_FORMAT() para dar formato al campo como HH:MM en una consulta 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

El TIME column type no acepta ningún parámetro o modificador para definir rango o de precisión. Sin embargo, puede omitir los segundos en insertar si tiene cuidado:

Tenga cuidado al asignar valores abreviados a la columna TIME. MySQL interpreta los valores abreviados de TIEMPO con dos puntos como la hora del día. Es decir, '11: 12 'significa '11: 12: 00', no '00: 11: 12 '. MySQL interpreta valores abreviados sin dos puntos suponiendo que los dos dígitos de la derecha representan segundos (es decir, como el tiempo transcurrido en lugar de que como la hora del día). Por ejemplo, se podría pensar en '1112' y 1112 en el sentido de '11: 12: 00' (12 minutos después de 11 horas), pero MySQL los interpreta como '00: 11: 12' (11 minutos, 12 segundos). Del mismo modo, '12' y 12 se interpretan como '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 | 
+------------+-----------+ 

... y se pueden quitar de lectura (si es necesario) mediante la aplicación de una adecuada TIME_FORMAT(), señalando que:

Si el valor de tiempo contiene una parte que hora es mayor que 23, los especificadores de formato % H y% k hora producen un valor mayor que el rango habitual de 0..23. Los otros especificadores de formato horas producen el valor del módulo hora 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 | 
+------------+---------+ 

Desde MySQL/5.7.5 también se puede utilizar un generated column para obtener un valor de la pantalla automáticamente:

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