Saltar al contenido

Crear campos de fecha a partir de día, mes y año en MySQL

Necesitamos tu apoyo para compartir nuestros ensayos acerca de las ciencias informáticas.

Solución:

Cuando tiene valores enteros para el año, el mes y el día, puede hacer DATETIME combinando MAKEDATE() y DATE_ADD(). MAKEDATE() con un día constante de 1 le dará un DATETIME para el primer día del año dado, y luego puede agregarle el mes y el día con DATE_ADD():

mysql> SELECT MAKEDATE(2013, 1);
+-------------------+
| MAKEDATE(2013, 1) |
+-------------------+
| 2013-01-01        |
+-------------------+

mysql> SELECT DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH);
+---------------------------------------------------+
| DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH) |
+---------------------------------------------------+
| 2013-03-01                                        |
+---------------------------------------------------+

mysql> SELECT DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY);
| DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY) |
+----------------------------------------------------------------------------------+
| 2013-03-11                                                                       |
+----------------------------------------------------------------------------------+

Entonces, para responder a la pregunta del OP:

SELECT * FROM `date`
WHERE DATE_ADD(DATE_ADD(MAKEDATE(year, 1), INTERVAL (month)-1 MONTH), INTERVAL (day)-1 DAY)
BETWEEN '2013-01-01' AND '2014-01-01';

Puede usar la función STR_TO_DATE().

Para crear una fecha ordenable string a partir de eso, necesitarás CONCAT para unir los pedazos y LPAD para asegurarse de que los campos de mes y día tengan dos dígitos. Algo como esto:

CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))

Una vez que tenga eso, debería poder usar BETWEEN, ya que estarán en un formato ordenable. Sin embargo, si aún necesita convertirlos en campos de fecha y hora reales, puede envolver todo en UNIX_TIMESTAMP() para obtener un valor de marca de tiempo.

Así que terminarías con algo como esto:

SELECT UNIX_TIMESTAMP(CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))) as u_date
WHERE u_date BETWEEN timestamp_1 and timestamp_2

Sin embargo, tenga en cuenta que esto será macizamente más lento que si el campo fuera solo una simple marca de tiempo en primer lugar. Y definitivamente debe asegurarse de tener un índice en los campos de año, mes y día.

Nos encantaría que puedieras comunicar esta división si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *