Ver Mensaje Individual
  #11 (permalink)  
Antiguo 04/04/2013, 19:55
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Solucion a llamar funcion como alias en clausula where

Sigue siendo matemática de fechas, al decir de Leonardo, y como mucho usas funciones de fecha, las que puedes encontrar en el manual de referencia (http://dev.mysql.com/doc/refman/5.0/...functions.html). No necesitas hacer operaciones aritméticas complejas para lograr algo tan simple.
Si quieres construir una fecha, a partir de otra, simplemente operas con lo necesario.
Código MySQL:
Ver original
  1. mysql> SELECT @campofecha ;
  2. +-------------+
  3. | @campofecha |
  4. +-------------+
  5. | 2010-04-01  |
  6. +-------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> SET @fecha := DATE(CONCAT(YEAR(CURDATE()), DATE_FORMAT(@campofecha, '-%m-%d')));
  10. Query OK, 0 rows affected (0.00 sec)
  11.  
  12. mysql> SET @fecha := ADDDATE(@fecha, INTERVAL 3 MONTH);
  13. Query OK, 0 rows affected (0.00 sec)
  14.  
  15. mysql> SELECT @fecha;
  16. +------------+
  17. | @fecha     |
  18. +------------+
  19. | 2013-07-01 |
  20. +------------+
  21. 1 row in set (0.00 sec)
Básicamente, con esto en dos líneas transformo al 01/04/2010 en el 01/04/2013, y luego en el 01/07/2013, sin necesidad de mayores complicaciones aritméticas ni comparaciones innecesarias...

¿Se entiende la idea?

Incluso más; puedo hacerlo así:
Código MySQL:
Ver original
  1. mysql> SET @campofecha := DATE('2010-04-01');
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @campofecha ;
  5. +-------------+
  6. | @campofecha |
  7. +-------------+
  8. | 2010-04-01  |
  9. +-------------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> SET @fecha := ADDDATE(@campofecha, INTERVAL (YEAR(CURDATE()) - YEAR(@campofecha)) YEAR);
  13. Query OK, 0 rows affected (0.06 sec)
  14.  
  15. mysql> SELECT @fecha;
  16. +------------+
  17. | @fecha     |
  18. +------------+
  19. | 2013-04-01 |
  20. +------------+
  21. 1 row in set (0.00 sec)
  22.  
  23. mysql>  SET @fecha := ADDDATE(@fecha, INTERVAL 3 MONTH);
  24. Query OK, 0 rows affected (0.00 sec)
  25.  
  26. mysql> SELECT @fecha;
  27. +------------+
  28. | @fecha     |
  29. +------------+
  30. | 2013-07-01 |
  31. +------------+
  32. 1 row in set (0.00 sec)

Y si lo anido más, lo puedo hacer en una sola linea:
Código MySQL:
Ver original
  1. mysql> SET @fecha := ADDDATE(ADDDATE(@campofecha, INTERVAL (YEAR(CURDATE()) - YEAR(@campofecha)) YEAR), INTERVAL 3 MONTH);
  2. Query OK, 0 rows affected (0.03 sec)
  3.  
  4. mysql> SELECT @fecha;
  5. +------------+
  6. | @fecha     |
  7. +------------+
  8. | 2013-07-01 |
  9. +------------+
  10. 1 row in set (0.01 sec)

Es más, ni siquiera lo tengo que poner en una variable, puedo operar directamente en una consulta:
Código MySQL:
Ver original
  1. mysql> SELECT ADDDATE(ADDDATE(@campofecha, INTERVAL (YEAR(CURDATE()) - YEAR(@campofecha)) YEAR), INTERVAL 3 MONTH) Vencimiento;
  2. +-------------+
  3. | Vencimiento |
  4. +-------------+
  5. | 2013-07-01  |
  6. +-------------+
  7. 1 row in set (0.00 sec)
Con esto último puedes ver que ni siquiera se necesita almacenarlo en ninguna parte, si el objetivo es usar ese valor para otra cosa (un UPDATE, por ejemplo). Simplemente se lo calcula donde se necesite, en tanto el campo "fecha" de la tabla esté accesible.
Por ejemplo:
Código MySQL:
Ver original
  1. UPDATE tabla
  2. SET vencimiento = ADDDATE(ADDDATE(fecha, INTERVAL (YEAR(CURDATE()) - YEAR(fecha)) YEAR), INTERVAL 3 MONTH)
  3. WHERE MONTH(fecha) = MONTH(CURDATE())
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 04/04/2013 a las 21:19