Cita:
Iniciado por juaniquillo
Sigo con problemas con mis calendarios...
Quiero escoger los records que sean mayor que una fecha y menor que otra. Ya lo he intentado así y no me funciona:
$fecha_junta = '2009-01-22'
Este es uno de los records
EventYear = 2009
EventMonth = 1
EventDay = 22
EventYear2 = 2009
EventMonth2 = 1
EventDay2 = 23
¿Alguien me podría decir que estoy haciendo mal?
te diré varias cosas, juaniquillo,
1) respecto a : $fecha_junta = '2009-01-22'
Veo que es una variable y que recoge la cadena en el orden y con los datos adecuados (año-mes-día) con dos dígitos mes y día. Por lo tanto no tienes que hacer ningún casting a date. En la comparación lo entenderá como fecha siempre que le pongas comillas para indicarle que es una cadena de fecha.
2) Respecto a la conversión a fecha de los datos de Eventyear, EventMonth y EventDay, creo que tendrás que hacer varias cosas. Por lo que veo se trata de un campo numérico, lo digo por el 1 (aunque no estoy seguro). Antes que nada debemos saber si es numérico, INT, o cadena de caracteres VARCHAR. Dependiendo de eso nos veremos obligados a hacer un casting a char o no.
3) la función que yo usaría para lo que quieres hacer es str_to_date(). Haz la prueba con esto si los campos EventYear, EventMonth y EventDay son de texto:
Opción uno: SELECT str_to_date(CONCAT(EventYear,'-',EventMonth,'-',EventDay, '%Y-%c-%e')) from nombretabla
Observa que he hecho un concat y un str_to_date indicándole que el mes y el día van con un dígito. Si ves las fechas bien (ej. 2008-12-30), ya sabes que esto podrá servirte. Pero si EventYear, EventMonth y EventDay son INT (creo que es así en tu caso), tendrás que hacer un CAST ... AS CHAR, como estos:
Opción dos: SELECT str_to_date(CONCAT(CAST(EventYear AS CHAR),'-',CAST(EventMonth AS CHAR),'-', CAST(EventDay AS CHAR), '%Y-%c-%e')) FROM nombretabla
Con una o con otra deberías ver una fecha bien conformada.
si funciona la dos, tendrías que hacer algo así (esta la he probado):
SELECT * FROM `tabla` WHERE '2009-01-22' between str_to_date(concat(cast(EventYear as char),'-',cast(EventMonth as char),'-',cast(Eventday as char)),'%Y-%c-%e') and str_to_date(concat(cast(EventYear2 as char),'-',cast(EventMonth2 as char),'-',cast(Eventday2 as char)),'%Y-%c-%e')
Si hubiera funcionado la opción uno, es decir, si los campos fueran varchar, deberías probar con algo así:
SELECT * FROM nombretabla WHERE '$fecha_junta' BETWEEN str_to_date(CONCAT(EventYear ,'-',EventMonth,'-', EventDay), '%Y-%c-%e') AND str_to_date(CONCAT(EventYear2,'-',EventMonth2,'-', EventDay2), '%Y-%c-%e')
No he podido probar todo, pero mis consejos son estos: vigila la naturaleza, forma y orden en que introduces los datos. El paso de cadena de texto a fecha hazlo con str_to_date() y para mayor o igual y menor o igual usa BETWEEN con el rango, pero para eso todos los datos deben ser interpretados como fecha. $fecha_junta, tal y como la tienes, no debería darte problemas siempre que la pongas entre comillas, y no tienes por qué modificar nada. Las otras dos fechas deben conformar una cadena que se convierta en fecha y para eso tendrás que convertir los números a char y luego hacer un concat; la conversión debe hacerse según el formato de fecha aceptado y, como no lo tienes, pues veo números de mes y día de un dígito, le tienes que indicar a la función str_to_date lo que le das. Por eso el uso de %c y %e, en lugar de los habituales %m y %d.
Como te he dicho, no lo he probado todo (no he arreglado el problema en casa). Hazlo tú y nos dices.