MySql cuando almacena una fecha lo hace deacuerdo a la norma ISO 8601 esto es YYYY-mm-dd.

¿Por que MySql Almacena fecha en ese formato?
La explicación es muy amplia y no lo trataremos ahora, pero lo podemos resumir en los siguientes puntos:
– Evitar formatos ambiguos
– Tener un formato único y universal
– Poder ser organizados de más a menos significativo
– Estar en formato ordenable, incluso si tratáramos a las fechas como cadenas de texto, podríamos ordenarlas alfabéticamente.

Si ingresamos una fecha que no cumpla con ese formato, simplemente provocará un error, ya que no sera recocido como fecha válida.

¿Como podemos solucionar esto?
Mysql Contiene una función llamada GET_FORMAT con el cual podemos insertar fechas con distinto formato, solo le tenemos que indicar en que formato estamos recibiendo la fecha para que MySQL luego lo procese.

Los formatos que acepta GET_FORMAT son los siguientes

Llamada función Resultado
GET_FORMAT(DATE,’USA’) ‘%m.%d.%Y’
GET_FORMAT(DATE,’JIS’) ‘%Y-%m-%d’
GET_FORMAT(DATE,’ISO’) ‘%Y-%m-%d’
GET_FORMAT(DATE,’EUR’) ‘%d.%m.%Y’
GET_FORMAT(DATE,’INTERNAL’) ‘%Y%m%d’
GET_FORMAT(DATETIME,’USA’) ‘%Y-%m-%d %H.%i.%s’
GET_FORMAT(DATETIME,’JIS’) ‘%Y-%m-%d %H:%i:%s’
GET_FORMAT(DATETIME,’ISO’) ‘%Y-%m-%d %H:%i:%s’
GET_FORMAT(DATETIME,’EUR’) ‘%Y-%m-%d %H.%i.%s’
GET_FORMAT(DATETIME,’INTERNAL’) ‘%Y%m%d%H%i%s’
GET_FORMAT(TIME,’USA’) ‘%h:%i:%s %p’
GET_FORMAT(TIME,’JIS’) ‘%H:%i:%s’
GET_FORMAT(TIME,’ISO’) ‘%H:%i:%s’
GET_FORMAT(TIME,’EUR’) ‘%H.%i.%s’
GET_FORMAT(TIME,’INTERNAL’) ‘%H%i%s’

Para demostrar el uso de esta función voy a crear una tabla:

CREATE TABLE `demo` (
`id` int(11) NOT NULL auto_increment,
`fecha` date default NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB

Supongamos que recibimos un fecha con el siguiente formato 15/01/2005 (dd/mm/YYYY). . Esto lo insertaremos de la siguiente manera.

INSERT INTO demo (fecha)
VALUES (STR_TO_DATE(REPLACE('15/01/2005','/','.') ,GET_FORMAT(date,'EUR')))

Explicaré lo que hace la sentencia
Convertimos la cadena de texto a un formato fecha con STR_TO_DATE.
Usamos REPLACE para reemplazamos las barras por el punto (.), según nuestra tabla de formatos.
Con GET_FORMAT(date,’EUR’) le decimos al mysql que la fecha que vamos ingresar esta en formato europeo

Probemos con otra fecha, insertaremos una fecha con el siguiente formato 10.31.2003 (mm.dd.YYYY)

INSERT INTO demo (fecha)
VALUES (STR_TO_DATE('10.31.2003' ,GET_FORMAT(date,'USA')))

Verificamos nuestros datos insertados, y vemos que esta en el formato estándar.

mysql> select * from demo;
+----+------------+
| id | fecha      |
+----+------------+
|  1 | 2005-01-15 |
|  2 | 2003-10-31 |
+----+------------+
2 rows in set (0.00 sec)

Espero que les sea de mucha utilidad y les evite muchos dolores de cabeza.

Hasta la próxima!

benjamin

CTO at GNBIT
Me llamo Benjamín Gonzales B, soy desarrollador de software con más de 15 años de experiencia, socio funduador de la empresa GNBIT.
Me apasiona todo lo relacionado a las nuevas tecnologías, me gusta investigar , leer y aprender cada día algo nuevo.
Desarrollo en PHP7+, JAVA, C#, JavaScript, entre otros y actualmente  estoy experimentando con lenguajes funcionales como: Erlang, Clojure y Scala 

Latest posts by benjamin (see all)

benjamin

Me llamo Benjamín Gonzales B, soy desarrollador de software con más de 15 años de experiencia, socio funduador de la empresa GNBIT. Me apasiona todo lo relacionado a las nuevas tecnologías, me gusta investigar , leer y aprender cada día algo nuevo. Desarrollo en PHP7+, JAVA, C#, JavaScript, entre otros y actualmente  estoy experimentando con lenguajes funcionales como: Erlang, Clojure y Scala 

3 Responses to “Insertando Fechas con Diferente Formato en MySQL”

  1. Hola buenas tardes, como puedo insertar varias fechas con horas simultáneamente en un mismo evento creado.

    Por ejemplo
    Evento #2
    Descripción : xxxxx
    Lugar: xxx
    Presupuesto: xxx
    Fecha
    * 2/9/18 Horario 4pm a 7pm
    *5/9/18 Horario 5 pm a 8 pm
    *20/9/18 Horario 11am a 5 pm

     

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.