Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/01/2009, 01:44
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 años
Puntos: 300
Respuesta: Mas probemas comparando fechas

Cita:
Iniciado por juaniquillo Ver Mensaje
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.

Última edición por jurena; 13/01/2009 a las 02:52