por - insertar hora en mysql
Almacenar fecha incompleta en el campo de fecha de MySQL (3)
Bueno, si usaste un campo de fecha entonces deberías esperar esos 0s. Una forma de deshacerte de ellos es mediante la selección de varchar
. Sin embargo, es mejor usar un campo de fecha ya que eso es lo que se almacena allí.
Si tiene que permitir que los usuarios ingresen una fecha incompleta, entonces tiene que ser una varchar
y en ese caso puede formatear la entrada con su script y almacenarla en esa columna
Quiero ofrecer al usuario la posibilidad de introducir fechas incompletas (por ejemplo, solo el año 2005 o enero de 1998) pero también fechas completas con año, mes, día ¿Puedo lograr esto usando un solo campo de fecha en la base de datos?
He intentado UPDATE tableA SET mydate = ''2001-00-00''
y parece que funciona (sin errores) pero no estoy seguro de si esto es correcto. Internamente, asumo que se usa una marca de tiempo, entonces, ¿cómo puede MySQL representar esos 0?
El almacenamiento de partes de fechas depende del modo sql en el que se ejecuta MySQL. Lea http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html , especialmente sobre las fechas no válidas en http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates .
Hay una pequeña nota en la documentación del DATE_FORMAT () sobre MySQL que permite fechas incompletas:
Los rangos para los especificadores de mes y día comienzan con cero debido a que MySQL permite el almacenamiento de fechas incompletas como ''2014-00-00''.
Como lo señaló @wonk0 , MySQL establecerá fechas no válidas para 0000-00-00 00:00:00
cuando ALLOW_INVALID_DATES
no esté establecido. Sin embargo, incluso cuando ALLOW_INVALID_DATES
no está configurado, la inserción de un año válido con el mes y el día establecidos en cero no parece activar este comportamiento, al menos no en mis pruebas (MySQL 5.1.54-1ubuntu4). He usado esta función antes sin ningún problema, pero hasta ahora no he podido encontrar documentación más detallada que describa este comportamiento en su totalidad.
Las comparaciones de fecha / hora también parecen funcionar como se esperaba: por ejemplo, 2011-01-00 > 2011-00-00
y 2011-00-01 > 2011-00-00
hacen lo que se espera.
ACTUALIZAR
Ver @wonk0 (por otro Mike) a una pregunta similar. Apunta a un extracto de The Definitive Guide to MySQL 5 :
En versiones anteriores de MySQL, los tipos de datos DATE y DATETIME hicieron solo una cantidad limitada de verificación de tipos. Los valores entre 0 y 12 para meses, y 0 y 31 para días fueron generalmente permitidos. Sin embargo, es responsabilidad del programa del cliente proporcionar datos correctos. (Por ejemplo, 0 es un valor permitido para un mes o un día, con el fin de proporcionar la posibilidad de almacenar datos incompletos o desconocidos).
A partir de MySQL 5.0.2, hay una validación más completa, de modo que solo se pueden almacenar datos válidos. Aún se permiten los valores de mes y día 0, así como la fecha de publicación.