Está en la página 1de 12

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

Consultas entre fechas (mysql)


google_ad_section_start 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 ... google_ad_section_end

  #1 (permalink)  

16/02/2011, 10:26
Fecha de Ingreso: diciembre-2008
google_ad Ubicación: Matehuala San Luis Postosi
_section_ Mensajes: 17
Antigüedad: 7 años, 5 meses
start(weig Puntos: 0
ht=ignore
)  

don_omar
google_ad
_section_
end
google_ad_section_start Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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. google_ad_section_end

  #2 (permalink)  

16/02/2011, 10:37
Fecha de Ingreso: noviembre-2007
google_ad Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
_section_s Mensajes: 22.860
Antigüedad: 8 años, 6 meses
tart(weigh Puntos: 2575
t=ignore)
gnzsoloyo  
google_ad
_section_e
nd
Moderador criollo
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start
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 SELECT *
2 FROM tabla
3 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)

google_ad_section_end

__________________
google_ad_section_start(weight=ignore) ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
google_ad_section_end

  #3 (permalink)  

16/02/2011, 10:44
Fecha de Ingreso: enero-2011
google_ad_sectio Ubicación: <?php $persona->ubicacion('ArkangelGammar'); ?>
n_start(weight=i Mensajes: 178
Antigüedad: 5 años, 4 meses
gnore)   Puntos: 19
ArkangelGammar
google_ad_sectio
n_end
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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 google_ad_section_end


__________________
google_ad_section_start(weight=ignore) "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. google_ad_section_end

  #4 (permalink)  

16/02/2011, 11:33
google_ad Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
_section_ Mensajes: 17
Antigüedad: 7 años, 5 meses
start(weig Puntos: 0
ht=ignore
)  

don_omar
google_ad
_section_
end
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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; :=) google_ad_section_end

  #5 (permalink)  

16/02/2011, 11:43
google_ad   Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
_section_s Mensajes: 22.860
Antigüedad: 8 años, 6 meses
tart(weigh Puntos: 2575
t=ignore)
gnzsoloyo
google_ad
_section_e
nd
Moderador criollo
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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');

google_ad_section_end
__________________
google_ad_section_start(weight=ignore) ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
google_ad_section_end

  #6 (permalink)  

16/02/2011, 13:06
google_ad   Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
_section_ Mensajes: 17
Antigüedad: 7 años, 5 meses
start(weig Puntos: 0
ht=ignore
)
don_omar
google_ad
_section_
end
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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. google_ad_section_end

  #7 (permalink)  

17/02/2011, 04:06
google_ad   Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
_section_s Mensajes: 22.860
Antigüedad: 8 años, 6 meses
tart(weigh Puntos: 2575
t=ignore)
gnzsoloyo
google_ad
_section_e
nd
Moderador criollo
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start
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.
google_ad_section_end
__________________
google_ad_section_start(weight=ignore) ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
google_ad_section_end

  #8 (permalink)  

17/02/2011, 09:29
google_ad   Fecha de Ingreso: diciembre-2008
Ubicación: Matehuala San Luis Postosi
Mensajes: 17
_section_ Antigüedad: 7 años, 5 meses
start(weig Puntos: 0

ht=ignore
)
don_omar
google_ad
_section_
end
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start
Cita:

Iniciado por gnzsoloyo


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. google_ad_section_end

  #9 (permalink)  

17/02/2011, 10:33
Fecha de Ingreso: noviembre-2007
google_ad Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
_section_s Mensajes: 22.860
Antigüedad: 8 años, 6 meses
tart(weigh
google_ad_section_start Respuesta: Consultas entre fechas (mysql) google_ad_section_end

google_ad_section_start 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. google_ad_section_end
__________________
google_ad_section_start(weight=ignore) ¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
google_ad_section_end

También podría gustarte