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

Cómo comparar con parte de un resultado??

Estas en el tema de Cómo comparar con parte de un resultado?? en el foro de Mysql en Foros del Web. Hola amig@s!! Almaceno información de fecha en un campo tipo char en la base de datos. Y me gustaría, para filtrar resultados, poder comparar una ...
  #1 (permalink)  
Antiguo 17/11/2009, 02:56
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Cómo comparar con parte de un resultado??

Hola amig@s!!

Almaceno información de fecha en un campo tipo char en la base de datos. Y me gustaría, para filtrar resultados, poder comparar una cadena con parte de ese char que almaceno.
Quiero decir, por ejemplo, si filtro por mes y escojo Enero, tengo que comparar la cadena '01' con el substring correspondiente del char almacenado.
Cuál sería la sintaxis correcta??

Gracias
  #2 (permalink)  
Antiguo 17/11/2009, 05:34
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: Cómo comparar con parte de un resultado??

Bueno, la sintaxis correcta sería usar un campo DATE y no un CHAR para almacenar una fecha. Sería mucho más simple.
Ahora, para poder hacer la búsqueda tendrás que usar funciones que operarán bien o mal según lo bien o mal que estén guardadas las fechas en la base.
Me explico: Si la fecha está guardada como "31/12/2009", estaríamos frente a un buen estándar y puedes usar MID() o STR_TO_DATE():
Código sql:
Ver original
  1. MID(campo, 3, 2)
  2. STR_TO_DATE(campo, '%d/%m/%Y')
Pero si se guardó algo como esto: "9/5/2009", la función MID() ya no sirve de esa forma, porque esto:
Código sql:
Ver original
  1. MID(campo, 3, 2)
daría esto:
Cita:
"5/"
Mi sugerencia, por cuestiones de prevención es usar la conversión de cadenas a fechas (STR_TO_DATE(campo, formato)), ya que definir una fecha implicaría algo así:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla
  3. WHERE MONTH(STR_TO_DATE(FECHA, '%d/%m/%Y')) = 1;
para obtener las fechas correspondientes a enero, por ejemplo
En cualquier caso que sea, deberás asegurarte de que los usuarios no puedan entrar fechas con un formato incorrecto.
__________________
¿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 17/11/2009, 05:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Cómo comparar con parte de un resultado??

AniMAYtions,
dinos en qué formato introduces en el campo varchar la fecha (ej. 2009/02/15, 15-02-2019, 15.2.2009, etc. Luego dinos si te gustaría cambiar los datos de esa fecha a un campo fecha con la forma adecuada, salvo que no puedas tocar la base o ya está hecha la programación.
Se adelantó gnzsoloyo.
  #4 (permalink)  
Antiguo 17/11/2009, 06:25
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Gracias chic@s por la pronta respuesta.

Resulta que no puse el campo como date puesto que no voy a trabajar con él más que para mostrarlo y buscar por mes y año(nada de buscar entre 2 fechas ni de darme una catidad de tiempo determinado).
Luego, las inserciones de fechas se realizan desde otra aplicación diferente a la que acceden los usuarios y creo que lo voy a poner tipo select para luego almacenarlo de la forma dd/mm/aaaa(el año no será select).
En el select del filtrado tengo como valor para cada mes por ejemplo Enero->01, Febrero->02... y así sucesivamente con todos los meses. Sólo tendría que extraer del campo que me almacena la fecha el substring correspondiente al mes para compararlo con estos valores.

De eso ia me encargo io, sólo necesito saber cómo extraer esa parte de la cadena.

Mil gracias de nuevo!!
  #5 (permalink)  
Antiguo 17/11/2009, 06:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Cómo comparar con parte de un resultado??

Las respuetas ya te las dio gnzsoloyo:

Código sql:
Ver original
  1. SELECT * FROM tabla WHERE MONTH(STR_TO_DATE(campofecha, '%d/%m/%Y')) = 1;
ó
Código sql:
Ver original
  1. SELECT * FROM tabla WHERE MID(campofecha, 4, 2)='01'
  #6 (permalink)  
Antiguo 17/11/2009, 07:12
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: Cómo comparar con parte de un resultado??

Cita:
Resulta que no puse el campo como date puesto que no voy a trabajar con él más que para mostrarlo y buscar por mes y año(nada de buscar entre 2 fechas ni de darme una catidad de tiempo determinado).
Bueno, precisamente por esa razón es que debiste ponerlo como DATE. Es mucho más eficiente en las búsquedas y ocupa en disco mucho menos espacio que ponerlo como CHAR.

Cita:
Luego, las inserciones de fechas se realizan desde otra aplicación diferente a la que acceden los usuarios y creo que lo voy a poner tipo select para luego almacenarlo de la forma dd/mm/aaaa(el año no será select).
Enorme error. Todos los DBMS almacenan las fechas en formato "aaaa/MM/dd", y desde el punto de vista de Bytes, lo almacenan con 4 u 8 bytes (8 bytes el DATETIME).
Si lo almacenas en el formato que dices deberás usar VARCHAR o CHAR, con el consiguiente problema de conversiones.
El formato elegido internacionalmente para el almacenamiento de fechas tiene un sentido enormemente práctico. Por darte un ejemplo, es mucho más fácil hacer ordenamientos progresivos, porque al estar el año y el mes al principio, jamás se producirán alteraciones del tipo:
Cita:
01/02/2009
01/03/2009
01/04/2009

02/02/2009
05/02/2009
¿Se entiende?

Cita:
En el select del filtrado tengo como valor para cada mes por ejemplo Enero->01, Febrero->02... y así sucesivamente con todos los meses. Sólo tendría que extraer del campo que me almacena la fecha el substring correspondiente al mes para compararlo con estos valores.
Sigue siendo ineficiente, porque es más simple para el DBMS hacer:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla
  3. WHERE MONTH(fecha) = 1;

Que hacer
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla
  3. WHERE MID(campofecha, 4, 2)='01';

En el primer caso tiene que extraer un número, cosa que se hace rápidamente. En el segundo, MySQL tiene que leer todas las cadenas, luego extraer la subcadena y luego hacer la comparación.
Es posible que en pruebas cortas con pocos registros no notes el problema, pero a medida que aumente la cantidad de entradas, la performance de la segunda opción se degradará, y bastante.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/11/2009, 07:31
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Muchas gracias por tu lección gnzsoloyo.
Pienso que ievas toda la razón así que mañana mismo a primera hora cambiaré a date el campo.
Otra cosa, en mi caso el date y el time son importantes; quiero decir que el personal de la otra parte de la aplicación tiene que introducir tanto fecha como hora. Aunque en un principio las búsquedas solo se harán por fecha(no sé si luego me van a pedir que se pueda hacer algo también con las horas). En este caso, debería de hacer 2 campos(uno para el date y otro para el time) o sería más eficiente ponerlo todo en un mismo campo datetime?

Gracias de nuevo!!

Última edición por aniMAYtions; 17/11/2009 a las 11:45 Razón: cruce de posts
  #8 (permalink)  
Antiguo 19/11/2009, 02:35
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Ey gnzsoloyo, qué me recomiendas??
Hacer 2 campos, uno para la fecha y otro para la hora o uno para las 2 cosas(date/time o timestamp )?

Saludos y gracias!!
  #9 (permalink)  
Antiguo 19/11/2009, 06:45
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: Cómo comparar con parte de un resultado??

Desde el punto de vista del espacio en disco y la practicidad, usaría TIMESTAMP, que usa 4 bytes, en lugar de DATETIME, que usa 8, o TIME y DATE, que suman 6.
__________________
¿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 19/11/2009, 07:21
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Lo he hecho así. Y mostrar la fecha con formato español o comparar fechas me resulta fácil.
Ahora lo difícil es insertar la fecha.
Me explico, la recojo de varios campos: un campo fecha que me la da en formato dd/mm/aaaa, un campo hora y otro minutos.
La fecha sí sabría insertarla bien con un date_format. Pero cómo hago para insertarlo todo correctamente cuando lo estoy recogiendo de campos distintos??

Por ahora lo que voy haciendo me deja el campo fecha a NULL. Os muestro el codigo de la función:

Código:
function insertaFecha($registro, $date, $hour, $min)
{
	$conexion = conectar();
	$timestamp =$date.' '.$hour.':'.$min.':00';
	$consulta = "Update tabla Set fecha = date_format($timestamp, '%Y-%m-%d %H:%i:%s') Where id_registro = $registro";
	$resultado = mysql_query($consulta, $conexion);
}
Suponiendo que $timestamp devuelve '20/11/2009 14:0:00'. Ya se que en la hora falta un cero, pero no creo que ese sea el problema. Lo he probado en el phpmyadmin añadiendole ese cero y me sigue poniendo el campo a null...

Alguna idea??

Gracias.
  #11 (permalink)  
Antiguo 19/11/2009, 07:38
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: Cómo comparar con parte de un resultado??

Atención, si lo que quieres es convertir un string en una fecha, estás usando la función equivocada:
Código sql:
Ver original
  1. UPDATE tabla
  2. SET fecha = STR_TO_DATE('2009-11-20 14:00:00', '%Y-%m-%d %T')
  3. WHERE id_registro = nrumerodelregistro;

Ahora bien, tienes que tener cuidado con esto: Si en el patrón pones guiones como separadores, debes enviarle guiones en el string. De lo contrario te dará NULL. Esa función espera un esquema determinado y debes respetarlo, así como debes respetar el esquema dado por el patrón.
Si quieres que te tome la fecha en formato español, sería:
Código sql:
Ver original
  1. UPDATE tabla
  2. SET fecha = STR_TO_DATE('2009-11-20 14:00:00', '%d/%m/%Y %T')
  3. WHERE id_registro = numerodelregistro;

Nota: El '%T' representa la hora en su formato completo: '00:00:00'.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 20/11/2009, 03:01
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Gracias gnzsoloyo. Pero ahora, cómo lo hago para, si recojo la fecha en formato dd/mm/aaaa, poder insertarla en la bd en formato aaaa/mm/dd??

Resulta que la fecha se introduce por medio del dhtml calendar. Y hay que mostrarla en formato español...

Iré googleando a ver si encuentro alguna solución rápido, pero mientras a ver si podeis responderme.

Mil gracias compañer@s!!
  #13 (permalink)  
Antiguo 20/11/2009, 03:19
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: Cómo comparar con parte de un resultado??

Eso te lo pueden decir mejor en el Foro de PHP, porque en definitiva es un problema de programación (yo en vb.net las fechas las recojo en los DateTimePicker, estos tienen una propiedad Value que me devuelve la fecha que yo almaceno en una variable, por ejemplo).
Mi sugerencia sería que continuaras los temas de formularios y otras cosas directamente con los expertos del Foro de PHP. Te podrán dar mejores consejos en esa área.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 20/11/2009, 04:06
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cómo comparar con parte de un resultado??

Gracias otra vez gnzsoloyo.

Lo he solucionado como tu dices, con PHP. Lo que pasa es eso, que como la solución pertenece a otra parte del foro no se si ponerla aquí.

Un saludo.
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:56.