MySQL – Un tipo de datos para almacenar fechas

Objetivo: presentar el tipo de datos DATE para la introducción de fechas en MySQL.

En ocasiones necesitarás almacenar fechas en tus tablas. La fecha de nacimiento de tus contactos, el vencimiento de una tarea, el día en que adquiriste un determinado libro de tu biblioteca, son algunos ejemplos de usos típicos.

MySQL tiene unos cuantos tipos para manejar fechas y horas. Hoy voy a mostrarte uno especializado en las primeras (es decir, sin incluir información horaria): el tipo DATE.

A la hora de trabajar con fechas debes tener en cuenta el formato que MySQL maneja, tanto para la introducción como para la visualización de datos.

Se indica primero el año, seguido del mes y terminando por el día, como en el siguiente ejemplo:

'2012-10-25'  -->  25 de octubre de 2012

Quédate con la copla: 'AAAA-MM-DD'. Si introduces una fecha errónea, MySQL se la tragará, pero la guardará como '0000-00-00'.

Cuando digo fecha errónea no me refiero únicamente a que cruces los campos. Fíjate en esto:

'2012-02-29'

es perfectamente válido, pues este año es bisiesto. Pero lo siguiente es erróneo,

'2011-02-29'

y MySQL lo almacenaría en la tabla como '0000-00-00'.

Veremos más adelante que podemos configurar MySQL para que no sea tan estricto a la hora de comprobar fechas. Pero no olvides que, por defecto, no te pasará ni una.

Observa también que las fechas las introducimos entre comillas, al igual que hacemos con los datos de tipo VARCHAR (no importa si son simples o dobles). Si se te olvidan, obtendrás un 0000-00-00; advertido quedas.

MySQL te permite cierta flexibilidad a la hora de introducir fechas:

'2012-4-5' es equivalente a '2012-04-05'.

Y para el año podemos registrar tan sólo las dos últimas cifras:

'12-10-5' es equivalente a '2012-10-5'.

Pero claro, esto presenta un problema: ¿cómo sé, en el ejemplo anterior, si me estoy refiendo a 2012 en vez de 1912?

MySQL sigue el siguiente protocolo a la hora de traducir fechas con sólo dos cifras en el año:

Si el año está comprendido entre 00 y 69, ambos incluidos, lo precede con un 20.

En caso contrario, es decir, entre 70 y 99, es precedido por 19.

MySQL también permite flexibilidad a la hora de elegir el separador entre los campos. Puedes usar otros signos de puntuación, aparte del guión. Por ejemplo, las siguientes fechas son equivalentes:

'2012-7-31'
'2012/7/31'
'2012#7#31'
'2012:7:31'

Para finalizar, vamos a practicar creando una tabla, denominada contactos, en la que registraremos el nombre, apellido y la fecha de nacimiento de nuestros conocidos:

mysql> CREATE TABLE contactos
    -> (
    -> nombre VARCHAR(20),
    -> apellidos VARCHAR(30),
    -> f_nacimiento DATE
    -> );
Query OK, 0 rows affected (0.38 sec)

Comprobemos su estructura:

mysql> DESC contactos;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| nombre       | varchar(20) | YES  |     | NULL    |       |
| apellidos    | varchar(30) | YES  |     | NULL    |       |
| f_nacimiento | date        | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Y eso es todo, en 'Sevilla' a '2012-06-07'.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/06/mysql-un-tipo-de-datos-para-almacenar-fechas/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


¡Accede al índice con todos los artículos sobre MySQL!

9 opiniones en “MySQL – Un tipo de datos para almacenar fechas”

  1. Buenos dias, queria saber si tenias el tutorial de como configurar mysql para que no sea tan estricto con las fechas como nombraste en este apartado!Tengo un gran problema con las fechas nulas con lo cual no me deja insertar lineas!Espero tu respuesta!Muchas gracias!

    1. Finalmente, no escribiré el artículo, pues creo que hay otros temas que debería tratar antes. De modo que contestaré directamente a la duda:
      Agrega la siguiente línea al fichero de configuración de MySQL:
      sql-mode=»ALLOW_INVALID_DATES»
      Eso te permitirá más flexibilidad a la hora de introducir fechas. Eso sí, comprobará, al menos, que el mes esté en el rango 1-12 y el día 1-31.
      Saludos

  2. hola, una pregunta, yo lo que quiero es crear una tabla para que me guarde el formato de la fecha de este modo: dia-mes-año y lo hago ejecutando desde la linea de comandos en mysql esto:

    create table datos ( id int primary key, fecha date(«%d/%m/%y»));

    y me da error todo el tiempo, he probado con comillas simples, dobles, con guiones, de mil maneras…
    tambien he probado asi:

    create table datos ( id int primary key, fecha date(now(), «%d/%m/%y»)); pero tambien me da error… ya no se como hacerlo. Me falta algo? ???

    1. Buenos días, Susana:

      NO puedes modificar el formato en el que MySQL almacena las fechas. Lo que SÍ puedes hacer es modificar el formato con el que se visualizan después. Echa un vistazo, por ejemplo, a la función DATE_FORMAT().

      Saludos

  3. Hola quiero saber si alguien sabe como traer una consulta php desde la seleccion de una fecha con un calendario javascript, me urge por favor!

  4. Buenas, estoy creando una base de datos la cual almacena datos sobre un curso, en el cual tengo que guardar las fechas de comienzo y final de dicho curso. Quisiera saber si hay alguna forma de al crearlas, la fecha de final de curso no pueda ser inferior a la fecha de inicio.
    Muchas gracias, un saludo.

  5. como hacer en mysql para q en la table q he creado no aparezca la fecha asi 000-00-00, sino como la introduje 15-05-1999.
    De antemano muchas gracias.

    att. MarcosSalcedo

  6. a mi me funciona el siguiente codigo:

    $data = $this->request->getPost();
    if ($data[‘FechaNacimiento’] == »){
    $data[‘FechaNacimiento’] =’0000-00-00′;
    }

    claro es un framework pero puedes tomar la idea

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies