Cuál es la mejor forma de almacenar fechas en MySQL

october calendar on wooden surface
Photo by Gabby K on Pexels.com

¿Tenés que desarrollar una aplicación que maneja fechas?

Tal vez un portal para reserva de turnos, o quizás algún sistema de membresías por tiempo limitado o por qué no un programa que le pregunte al visitante su fecha de nacimiento y le diga el signo del horóscopo chino al que pertenece.

Más allá de cuál sea el objetivo de la aplicación en algún lado vas a necesitar almacenar fechas.

Y ese lado será probablemente una base de datos relacional y, más aún, si estás usando PHP, seguramente sea MySQL.

Existen varias opciones que podrías usar para definir el tipo de datos del campo en cuestión y la decisión puede no ser trivial.

Usar un VARCHAR para almacenar un dato fecha

Si bien técnicamente podrías guardar una fecha en un campo de tipo VARCHAR (O cualquier otro tipo string), esto te hará difícil resolver algunos problemas como por ejemplo ordenar un set de resultados en función de la línea de tiempo.

Es decir, si una fecha es '2020-02-01' y la otra es '19000-02-01' el motor te dirá que la primera es posterior a la segunda.

Esto sucede porque, en lugar de tomar el valor como una fecha, se lo está tratando como una simple cadena de caracteres y, por lo tanto, se está aplicando el orden lexicográfico.

Esto significa que para comparar se están tomando los caracteres y se comparan uno a uno, de este modo:

20200201
190000201

Por otra parte, como se trata de cadenas, el motor no será capaz de determinar que '2020-13-35' no es un valor aceptable.

Así que… no te lo recomiendo

Usar un TIMESTAMP para almacenar un dato fecha

Un segundo tipo de datos que podrías usar para guardar fechas es el TIMESTAMP.

Este seguramente va a funcionar mejor que el VARCHAR, pero tampoco es el ideal.

El TIMESTAMP es, internamente, un número muy grande que mide cuántos segundos pasaron desde segundo uno de UNIX (1970-01-01 00:00:01).

Usualmente este tipo de datos se utiliza para operaciones que requieren altísima precisión, como procesos de tiempo real… un poco exagerado cuando se quiere saber la fecha en que una persona recibió su último aumento de sueldo, ¿no?

Usar un DATE para almacenar un dato fecha

La mejor opción es usar un campo de tipo DATE.

Este tipo de datos modela una fecha mediante una estructura que tiene separados los componentes del mes, día y año.

Si bien al momento de visualizarlo no será distinguible de un VARCHAR que tenga el mismo contenido, a nivel funcional será muy diferente.

Entre otras, el tener los datos almacenados usando el tipo correcto permitirá realizar consultas como:

SELECT * FROM usuarios WHERE subscription_date BETWEEN '2020-01-10' AND '2020-01-20';

Y obtener como resultado aquellos usuarios que se han suscrito a nuestro sitio entre el 10 y el 20 de Enero de 2020.

Usar un DATETIME para almacenar un dato fecha

Si necesitas almacenar, además de la fecha, la hora exacta en que sucedió algo, lo mejor es utilizar el tipo de datos DATETIME que se comporta igual que DATE pero agregando la información de horas, minutos y segundos.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

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