Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Mas probemas comparando fechas

Estas en el tema de Mas probemas comparando fechas en el foro de Mysql en Foros del Web. 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í ...
  #1 (permalink)  
Antiguo 12/01/2009, 13:36
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Mas probemas comparando fechas

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

Código sql:
Ver original
  1. SELECT * FROM calendario WHERE (DATEDIFF(CAST(CONCAT(EventYear,'-', EventMonth,'-', EventDay) AS DATE), (CAST('$fecha_junta' AS DATE))) >= 0) AND (DATEDIFF(CAST(CONCAT(EventYear2,'-', EventMonth2,'-', EventDay2) AS DATE), (CAST('$fecha_junta' AS DATE))) <= 0)

Código sql:
Ver original
  1. SELECT * FROM calendario WHERE (CAST(CONCAT(EventYear,'-', EventMonth,'-', EventDay) AS DATE) >= (CAST('$fecha_junta' AS DATE))) AND (CAST(CONCAT(EventYear2,'-', EventMonth2,'-', EventDay2) AS DATE) <= (CAST('$fecha_junta' AS DATE)))

Pero no me escoge ninguna fecha. El segundo lo considero mas al grano pero no me funcionó así que intenté con el otro pero tampoco. ¿Alguien me podría decir que estoy haciendo mal?
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #2 (permalink)  
Antiguo 13/01/2009, 01:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
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
  #3 (permalink)  
Antiguo 14/01/2009, 07:34
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Mas probemas comparando fechas

Gracias de nuevo jurena. Los campos son integer como habías sospechado. Voy a probar lo que dices y después te cuento.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #4 (permalink)  
Antiguo 14/01/2009, 08:25
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Mas probemas comparando fechas

el de:

Código sql:
Ver original
  1. 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')

Gracias de nuevo por todo. Este calendario me funcionaba al principio cuando era básico pero al tratar expandir las funciones me ha dado muchos problemas. Voy a tener que re-estructurar las tablas para hacerlo mas eficiente cuando tenga algo de tiempo.

saludos.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:58.