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

Consultas entre fechas (mysql)

Estas en el tema de Consultas entre fechas (mysql) en el foro de Mysql en Foros del Web. Hola buenas a todos. nuevamente solicitando su gran ayuda. Bueno lo que pasa es que tengo que realizar unas consultas entre distintas fechas. el problema ...
  #1 (permalink)  
Antiguo 16/02/2011, 11:26
 
Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Consultas entre fechas (mysql)

Hola buenas a todos. nuevamente solicitando su gran ayuda.

Bueno lo que pasa es que tengo que realizar unas consultas entre distintas fechas.
el problema esta en que los datos de la fecha se guardaron en un campo varchar y con el siguiente formato "dd/m/aaaa" ejemplo: 14/2/2011, 14 de febrero del 2011, espero me puedan hayudar, ya intente con la funcion between, mayor y menor que , pero no funciona me trae las fechas tambien de otros años.

espero me puedan hayudar. muchas gracias de antemano.
  #2 (permalink)  
Antiguo 16/02/2011, 11:37
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consultas entre fechas (mysql)

Cita:
el problema esta en que los datos de la fecha se guardaron en un campo varchar y con el siguiente formato "dd/m/aaaa" ejemplo: 14/2/2011, 14 de febrero del 2011, espero me puedan hayudar, ya intente con la funcion between, mayor y menor que , pero no funciona me trae las fechas tambien de otros años.
Clásico problema...
Lo que debes hacer es utilizar la función de conversión de cadenas a fechas STR_TO_DATE(), usando la configuración de cadena apropiada:

Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fechabuscada BETWEEN STR_TO_DATE(fechadesde, '%d/%m/%Y') AND STR_TO_DATE(fechahasta, '%d/%m/%Y');
de esa forma puedes hacer que compare correctamente contra un valor dado:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   (NOW() BETWEEN STR_TO_DATE('01/01/2011', '%d/%m/%Y') AND STR_TO_DATE('01/03/2011', '%d/%m/%Y')) Resultado,
  3.     ->   STR_TO_DATE('01/01/2011', '%d/%m/%Y') DESDE,
  4.     ->   STR_TO_DATE('01/03/2011', '%d/%m/%Y') HASTA;
  5. +-----------+------------+------------+
  6. | Resultado | DESDE      | HASTA      |
  7. +-----------+------------+------------+
  8. |         1 | 2011-01-01 | 2011-03-01 |
  9. +-----------+------------+------------+
  10. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/02/2011, 11:44
Avatar de ArkangelGammar  
Fecha de Ingreso: enero-2011
Ubicación: <?php $persona->ubicacion('ArkangelGammar'); ?>
Mensajes: 179
Antigüedad: 13 años, 3 meses
Puntos: 19
Respuesta: Consultas entre fechas (mysql)

El error lo tenes en la definicion del campo. Lo tenes que definir como DATETIME y probar algo asi:

Código PHP:

$sql 
"SELECT * FROM tabla
        WHERE  (tabla.fecha >= '$fec_ini' AND tabla.fecha <= '$fec_fin') 
            ORDER BY id_tabla"

En donde $fec_ini y $fec_fin yo los defini asi

Código PHP:
$fec_ini  $_POST['fecha_inicial']." 00:00:00";
$fec_fin  $_POST['fecha_final']." 23:59:59"
Aunque de todas maneras tenes un error de concepto, no tendrias que definir las fechas con un varchar, ya que la comparacion entre esos string nunca va a ser lineal.

Te sugiero que cambies el formato a DATETIME

Espero haber ayudado.

Saludos cordiales
__________________
"No entiendes algo al menos que seas capaz de explicarselo a tu abuela.
Cada dia sabemos mas....y entendemos menos...."

A. Einstein - Genio mas alla de la razon.
  #4 (permalink)  
Antiguo 16/02/2011, 12:33
 
Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Consultas entre fechas (mysql)

Gracias a los dos amigos, pero no me funciono, mejor voy a cambiar los datos en la base de datos y luego a cambiar el tipo de dato en el campo. como datos extra es que en la tabla ya existe bastante informacion con ese formato y al cambiar directamente el tipo de dato en el campo de fecha me elimina la info y pone 0000-00-00, asi que resumiendo:

1.- Cambio la informacion a un formato aceptable.
2.- Cambio el tipo de dato en la base.

a menos que me recomienden otra cosa, espero que esto me funcione.

GRACIAS : Por gente como ustedes este es el mejor foro de la red=ustedes los mejores.

!! que es el carma tengo 0; :=)
  #5 (permalink)  
Antiguo 16/02/2011, 12:43
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consultas entre fechas (mysql)

Eso es lo mejor. Evitarás problemas a futuro.
Te comento: Te pone 0000-00-00 como fecha cuando cambias el tipo de datos simplemente porque el dato que ya contiene ese campo esta de entada mal escrito.
¿Probaste la consulta tal como te la propuse? Debería haber funcionado.

Haz lo siguiente:
Crea un campo de tipo DATETIME en la misma tabla:
Código MySQL:
Ver original
  1. ALTER TABLE tabla ADD COLUMN fecha_nueva DATE;

Actualiza el campo, para no perder los datos viejos:
Código MySQL:
Ver original
  1. UPDATE TABLE fecha_nueva = STR_TO_DATE(campofechavieja, '%d/%m/%Y');

Prueba los datos:
Código MySQL:
Ver original
  1. SELECT fecha_nueva FROM tabla;
Si algún campo contiene NULL o "0000-00-00", es porque en ese registro la fecha estaba mal escrita y deberás ingresarlos a mano.
Si todo va bien,
Código MySQL:
Ver original
  1. ALTER TABLE tabla DROP COLUMN DROP campofechavieja;

Fijate tu mismo si lo que debe ir es DATE o DATETIME. En el segundo caso el patron del STR_TO_DATE debe ser:
Código MySQL:
Ver original
  1. STR_TO_DATE(campofechavieja, '%d/%m/%Y %H');
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 16/02/2011, 14:06
 
Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Consultas entre fechas (mysql)

ok, muchas gracias, ya ordene la informacion con un script y cambie el tipo de dato en la definicion de la tabla, sin ningun problema.

por ultimo, para guardar una fecha sabendo que solamente se va a utilizar año-mes-dia, es mejor que el campo sea de tipo DATE o DATETIME, que me recomiendas.

cual es mejor y porque ?? Sono muy a pregunta de examen...jejeje

Gracias otra vez por contestar tan rapido y por compartir tus conocimientos.


----------------------------
sigo sin saber como se obtiene ese carma... tengo cero.
  #7 (permalink)  
Antiguo 17/02/2011, 05:06
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consultas entre fechas (mysql)

Cita:
por ultimo, para guardar una fecha sabendo que solamente se va a utilizar año-mes-dia, es mejor que el campo sea de tipo DATE o DATETIME, que me recomiendas.
La respuesta la puedes sacar del Manual: MySQL 5.0 Reference Manual :: 11 Tipos de columna :: 11.5 Requisitos de almacenamiento según el tipo de columna
Es un tema que defines cuando analizas la información que debes guardar: Si va a usar sólo las fechas, DATE; pero si vas a almacenar fechas relacionadas con la fecha, es mejor no hacerlo en dos campos, puedes hacerlo en DATETIME o TIMESTAMP, dependiendo de algunos factores.
La diferencia ente almacenar DATE o DATETIME es simple: son 3 bytes por registro contra 8 bytes. Tu eliges.
La clave para la selección de tipos de columna es simple: Nunca se pone un campo menor al máximo que se necesita, ni mayor tampoco.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 17/02/2011, 10:29
 
Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Consultas entre fechas (mysql)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Si va a usar sólo las fechas, DATE; pero si vas a almacenar fechas relacionadas con la fecha.
Nuevamente gracias amigo gnzsoloyo, disculpa mi ignoracncia pero no entendi esa parte de almacenar fechas relacionadas con la fecha, si me pudieras dicipar esa duda.

que tengas un buen dia.
  #9 (permalink)  
Antiguo 17/02/2011, 11:33
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consultas entre fechas (mysql)

Perdón, quedó mal escrito, me refería a horas relacionadas con la fecha, es decir que lo que no te conviene es usar un campo para la fecha y otro para la hora. En ese caso es mejor un sólo DATETIME o TIMESTAMP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 17/02/2011, 18:16
 
Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Consultas entre fechas (mysql)

a bien, bueno pues muchas gracias por despejarme todas las dudas, te lo agradesco enormemente.

saudos y bendiciones desde Matehuala, SLP, Mexico.

Etiquetas: fechas
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 07:06.