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

Queries con fechas

Estas en el tema de Queries con fechas en el foro de Mysql en Foros del Web. Hola buenos dias... Necesito hacer dos consultas con fecha de una base de datos pero no se como hacerlas... Serian algo parecido a esto @import ...
  #1 (permalink)  
Antiguo 03/05/2012, 09:54
 
Fecha de Ingreso: septiembre-2011
Ubicación: Caracas
Mensajes: 240
Antigüedad: 12 años, 6 meses
Puntos: 9
Queries con fechas

Hola buenos dias... Necesito hacer dos consultas con fecha de una base de datos pero no se como hacerlas... Serian algo parecido a esto

Código SQL:
Ver original
  1. SELECT * FROM tabla WHERE fecha<=mes_y_año_actual

La segunda haria parte de un ciclo for y seria algo asi

for(i=1; i<=dia_actual; i++)

Código SQL:
Ver original
  1. SELECT SUM(campo_a_sumar) FROM tabla WHERE fecha=i/mes_actual/año_actual

Si alguien sabe como podria hacer para resolver estos problemas... Muchas gracias
  #2 (permalink)  
Antiguo 03/05/2012, 10:04
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: Queries con fechas

En esencia (respetando el formato ANSI de fechas), lo que tienes que poner es algo como:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha<='2012-04-30'

y para obtener un rango, sin necesidad de hacer consultas repetitivas:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha BETWEEN '2012-04-01' AND '2012-04-30'

Pero para resolverlo, primero tenemos que estar seguros de cómo estás guardando la fecha, porque para que la consulta funcione de esa frma el camp o"fecha" debe ser un DATE y no un VARCHAR, como los principiantes suelen poner.
¿Cómo estás almacenando la fecha?
__________________
¿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 03/05/2012, 10:07
 
Fecha de Ingreso: septiembre-2011
Ubicación: Caracas
Mensajes: 240
Antigüedad: 12 años, 6 meses
Puntos: 9
Respuesta: Queries con fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En esencia (respetando el formato ANSI de fechas), lo que tienes que poner es algo como:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha<='2012-04-30'

y para obtener un rango, sin necesidad de hacer consultas repetitivas:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha BETWEEN '2012-04-01' AND '2012-04-30'

Pero para resolverlo, primero tenemos que estar seguros de cómo estás guardando la fecha, porque para que la consulta funcione de esa frma el camp o"fecha" debe ser un DATE y no un VARCHAR, como los principiantes suelen poner.
¿Cómo estás almacenando la fecha?
Obviamente es un campo date... Pero el problema es que quiero utilizar la fecha actual sin necesidad de escribirlo, es decir, algo dinamico... No se si me explico
  #4 (permalink)  
Antiguo 03/05/2012, 10:55
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: Queries con fechas

Pues en ese caso la consulta se vuelve muy simple:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha<=CURDATE();
o bien:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha BETWEEN '2012-04-01' AND CURDATE()
En incluso se puede usar un parámetro numérico para tomar una cantidad de dias hacia atrás, digamos, doce:
Código MySQL:
Ver original 
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/05/2012, 11:01
 
Fecha de Ingreso: septiembre-2011
Ubicación: Caracas
Mensajes: 240
Antigüedad: 12 años, 6 meses
Puntos: 9
Respuesta: Queries con fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pues en ese caso la consulta se vuelve muy simple:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha<=CURDATE();
o bien:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE fecha BETWEEN '2012-04-01' AND CURDATE()
En incluso se puede usar un parámetro numérico para tomar una cantidad de dias hacia atrás:
Código MySQL:
Ver original
  1. FROM tabla
Lo que pasa es que haciendolo de esa manera se va a mostrar de la fecha actual hacia atras varios meses inclusive... Yo lo que quiero es que se delimite por el mes y el año actual...

Dejame explicarlo mejor... Quiero que en este mes de mayo se traigan todos los registros del mes de mayo de este año... Si es junio, serian los registros de dichos mes... Con la condicion que expones en junio, tambien se traeria los registros de mayo tambien

Lo que pasa es que quiero hacer los queries asi porque quiero mostrar en una tabla tipo calendario el valor de un campo de la base de datos, y en vez del dia, muestro dicho valor... Como comprenderas, no puedo mostrar los valores de otros meses en dicha tabla... Espero haberme explicado... Muchas gracias

Última edición por dragonfire256; 03/05/2012 a las 11:06
  #6 (permalink)  
Antiguo 03/05/2012, 11:10
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: Queries con fechas

Lo que te estoy dando son ejemplos para que veas que hay formas de usar las diversas funciones de fcha que MySQL tiene de modos flexibles.
No tiene ninguna utilidad traer en forma iterativa cada día de un mes, cuando puedes traer el rango completo que conseguirías de todos modos. La diferencia está en que la performance obtenida usando BETWEEN no la vas a superar usando ese for/next que porpones.
En cuanto a lo del mes y año en curso, lo único que necesitas es utilziar las funciones MONTH() y YEAR() para extraer las fechas que necesitas:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE MONTH(fecha) = MONTH(CURDATE()) AND YEAR(fecha) = YEAR(CURDATE())

No te quedes sólo con lo que te propongo. Fijate en el manual de referencia y busca cuál es la función o funciones más adecuadas para tu caso, pero en lo posible no hagas consultas iterativas. Son un calvario para la performance.
__________________
¿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 03/05/2012, 12:10
 
Fecha de Ingreso: septiembre-2011
Ubicación: Caracas
Mensajes: 240
Antigüedad: 12 años, 6 meses
Puntos: 9
Respuesta: Queries con fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Lo que te estoy dando son ejemplos para que veas que hay formas de usar las diversas funciones de fcha que MySQL tiene de modos flexibles.
No tiene ninguna utilidad traer en forma iterativa cada día de un mes, cuando puedes traer el rango completo que conseguirías de todos modos. La diferencia está en que la performance obtenida usando BETWEEN no la vas a superar usando ese for/next que porpones.
En cuanto a lo del mes y año en curso, lo único que necesitas es utilziar las funciones MONTH() y YEAR() para extraer las fechas que necesitas:
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE MONTH(fecha) = MONTH(CURDATE()) AND YEAR(fecha) = YEAR(CURDATE())

No te quedes sólo con lo que te propongo. Fijate en el manual de referencia y busca cuál es la función o funciones más adecuadas para tu caso, pero en lo posible no hagas consultas iterativas. Son un calvario para la performance.

Ya que no me recomiendas consultas iterativas, que me recomendarias para conseguir lo que quiero? Es decir, que en cada casilla de una tabla, muestre el valor de una suma (por eso el sum que esta mas arriba) dependiendo del dia, es decir, que si la suma del dia 1 del mes actual y el año actual tiene como resultado 10 muestre eso, si el dia 2 la suma da 9, que muestre eso y asi sucesivamente... Por cierto, tu query esta funcionando perfectamente Muchas gracias
  #8 (permalink)  
Antiguo 03/05/2012, 12:41
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: Queries con fechas

Ese tipo de resultados se obtiene con el agrupamiento.
Supongamos que necesitas las ventas realizadas en cada día por un vendedor, para un mes determinado, con subtotales por vendedor.
Eso sería:
Código MySQL:
Ver original
  1. SELECT vendedor_id, fecha, SUM(importe) totalVenta
  2. FROM ventas
  3. GROUP BY vendedor_id, fecha WITH ROLLUP;
Esa última cláusula agrega un registro adicional al final de cada lista de días del mismo vendedor, con NULL en los dos campos y el subtotal. Al final de toda la tabla inserta además el total final.
Tiene el único inconveniente que no se la puede ordenar de esa forma, porque alteraría todo el resultado. Para hacer una lista ordenada con subtotales, hay que ordenar previamente la tabla origen:
Código MySQL:
Ver original
  1. SELECT vendedor_id, fecha, SUM(importe) totalVenta
  2. FROM (SELECT * FROM ventas ORDER BY vendedor_id, fecha) ventas
  3. GROUP BY vendedor_id, fecha WITH ROLLUP;
Mas o menos así es la idea.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 03/05/2012, 14:57
 
Fecha de Ingreso: septiembre-2011
Ubicación: Caracas
Mensajes: 240
Antigüedad: 12 años, 6 meses
Puntos: 9
Respuesta: Queries con fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Ese tipo de resultados se obtiene con el agrupamiento.
Supongamos que necesitas las ventas realizadas en cada día por un vendedor, para un mes determinado, con subtotales por vendedor.
Eso sería:
Código MySQL:
Ver original
  1. SELECT vendedor_id, fecha, SUM(importe) totalVenta
  2. FROM ventas
  3. GROUP BY vendedor_id, fecha WITH ROLLUP;
Esa última cláusula agrega un registro adicional al final de cada lista de días del mismo vendedor, con NULL en los dos campos y el subtotal. Al final de toda la tabla inserta además el total final.
Tiene el único inconveniente que no se la puede ordenar de esa forma, porque alteraría todo el resultado. Para hacer una lista ordenada con subtotales, hay que ordenar previamente la tabla origen:
Código MySQL:
Ver original
  1. SELECT vendedor_id, fecha, SUM(importe) totalVenta
  2. FROM (SELECT * FROM ventas ORDER BY vendedor_id, fecha) ventas
  3. GROUP BY vendedor_id, fecha WITH ROLLUP;
Mas o menos así es la idea.
Dejame decirte que tu idea funciono... Muchas gracias hermano... Aqui dejo la sentencia sql por si alguien mas necesita algo parecido

Código SQL:
Ver original
  1. SELECT fecha,SUM(horas) FROM (SELECT * FROM reporte_horas ORDER BY DAY(fecha)) reporte_horas WHERE MONTH(fecha)=MONTH(curdate()) AND YEAR(fecha)=YEAR(CURDATE())GROUP BY fecha

Por cierto, para que sirve el ROLLUP?

Muchas gracias

Etiquetas: queries, select, tabla, campos
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 14:41.