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ó.