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

Obtener media de fechas

Estas en el tema de Obtener media de fechas en el foro de Bases de Datos General en Foros del Web. Hola, soy un poco novato en bases de datos y me gustaría que me ayudarais en mi problema. Resulta que debo de sacar la media ...
  #1 (permalink)  
Antiguo 22/02/2010, 04:34
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta Obtener media de fechas

Hola, soy un poco novato en bases de datos y me gustaría que me ayudarais en mi problema.

Resulta que debo de sacar la media de los días de una base de datos, he intentado usar la siguiente sentencia pero da error puesto que entiendo que le es imposible sumar fechas:

Código:
mySQLid= "Select SUM(REC_DATE) from REVERSE where HOLD_STATUS='Ajustado'"
Ahora mismo haciendo:

Código:
mySQLid= "Select REC_DATE from REVERSE where HOLD_STATUS='Ajustado'"
solo me coge la fecha de la primera columna con estado Ajustado.

La idea es coger todas las fechas de piezas que están en distintos estados, y para cada HOLD_STATUS hacer la media de la resta de los días desde que se añadió a la base de datos hasta la fecha actual.

A ver si a alguien se le ocurre algo.

Gracias, un saludo.
  #2 (permalink)  
Antiguo 22/02/2010, 05:46
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: Obtener media de fechas

Cita:
La idea es coger todas las fechas de piezas que están en distintos estados, y para cada HOLD_STATUS hacer la media de la resta de los días desde que se añadió a la base de datos hasta la fecha actual.
Según esto, lo que quieres hacer no es la media de las fechas, sino la media de los días que han pasado desde que se insertó en la base de datos.

Sería algo así:

SELECT
AVG(TO_DAYS( CURRENT_DATE ) - TO_DAYS( REC_DATE ))
FROM
(SELECT REC_DATE from REVERSE where HOLD_STATUS='Ajustado')


Más información sobre funciones de fecha en MySQL

http://dev.mysql.com/doc/refman/5.1/...functions.html
  #3 (permalink)  
Antiguo 22/02/2010, 06:02
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Hola, gracias por contestar. Evidentemente llevas razón, no me supe explicar en un principio; por eso añadí el último comentario. Creo que la idea que me das es la acertada pero no se porqué me da error la función TO_DAYS; ya había intentado usarla antes pero sin éxito. ¿A qué se debe? Gracias de nuevo y disculpa mi ignorancia....

Cita:
Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Undefined function 'TO_DAYS' in expression.
Un saludo.

Quiero añadir que trabajo con access.


Ok, acabo de averiguar que TO_DAYS se corresponde con DAYS y CUR_DATE con DATE en access. Gracias de nuevo.

Última edición por hpepe; 22/02/2010 a las 06:13
  #4 (permalink)  
Antiguo 22/02/2010, 09:36
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Bueno, ahora se me complica el asunto.

El problema ahora es similar solo que tengo que usar 2 tablas distintas.

Tengo que calcular la media de los días que han pasado desde que se hizo un último comentario de la pieza en la base de datos.

Para ello dispongo de dos tablas, una la reverse utilizada antes y otra la mensajes donde aparecen dos campos, uno la fecha y otro la hora de todos los comentarios que se han realizado. Evidentemente tengo que quedarme con el comentario más reciente.....

Resumiendo debo de para cada hold status (tabla reverse), mirar a través de su ID que es la misma en la otra (tabla mensajes), todos los mensajes añadidos, quedarme con el más nuevo y hacer la media.

No se si alguien se hace una idea más o menos de lo que se pretende.

Gracias a todos.

Un saludo.
  #5 (permalink)  
Antiguo 22/02/2010, 11:22
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Exclamación Respuesta: Obtener media de fechas

Bueno hasta ahora lo que hecho a sido lo siguiente:


Cita:
mySQLac9= "SELECT AVG(DAY(DATE() - DAY(DATE_MESS))) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART FROM REVERSE where HOLD_STATUS='Ajustado')"
El problema que tengo es que de esta forma me coge todas las fechas de MESSAGES y a mi me gustaría distinguir el mensaje más actual mediante las columnas de la tabla DATE_MESS(FECHA) y TIME_MESS(HORA) y hacer la media de solo esas fechas.....

¿A alguien se le ocurre cómo hacerlo?

Muchas gracias.
  #6 (permalink)  
Antiguo 22/02/2010, 12:18
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, 5 meses
Puntos: 2658
Respuesta: Obtener media de fechas

Perdón, pero ¿qué DBMS estás usando?
Pregunto para estar seguro de qué funcionales se pueden usar, ya que no todas existen de la misma forma en todos los motores.
__________________
¿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 23/02/2010, 02:09
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Perdón, pero ¿qué DBMS estás usando?
Pregunto para estar seguro de qué funcionales se pueden usar, ya que no todas existen de la misma forma en todos los motores.
Microsoft Access.

Gracias, un saludo.
  #8 (permalink)  
Antiguo 23/02/2010, 02:50
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Se me ha ocurrido usar la función MAX para que almacene los registros más nuevos pero existe algún conflicto en la función.

Cita:
mySQLac9== "SELECT AVG(DAY(DATE() - DAY(DATE_MESS))) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART, Max(DATE_MESS), Max(TIME_MESS) FROM REVERSE where HOLD_STATUS='Ajustado')"

Cita:
Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Microsoft Access Driver] You have written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause. Revise the SELECT statement of the subquery to request only one field.
  #9 (permalink)  
Antiguo 23/02/2010, 03:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Otra forma más simple sería obteniendo el que tenga un ID_MESSAGE más alto que corresponderá con el mensaje más actual, la idea quedaría así solo que con el mismo error que comento anteriormente...

Cita:
mySQLac9= "SELECT AVG(DAY(DATE() - DAY(DATE_MESS))) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART, Max(ID_MESSAGE) FROM REVERSE where HOLD_STATUS='Ajustado')"
¿Alguna idea? Gracias.
  #10 (permalink)  
Antiguo 23/02/2010, 03:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Bueno, parece que el error era donde ponía Max, de esta forma si me funciona aunque estoy aún por comprobar que me calcule lo que pretendo....

Cita:
mySQLac9= "SELECT AVG(DAY(DATE()) - DAY(DATE_MESS)),Max(ID_MESSAGE) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART FROM REVERSE where HOLD_STATUS='Ajustado')"
  #11 (permalink)  
Antiguo 23/02/2010, 07:01
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Pues no termina de funcionar correctamente, en los HOLD_STATUS donde solo hay una pieza no calcula correctamente la media....

¿Alguna idea? Gracias.
  #12 (permalink)  
Antiguo 23/02/2010, 08:03
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, 5 meses
Puntos: 2658
Respuesta: Obtener media de fechas

Hay una posibilidad a considerar, que es calcular la diferencia de fechas tomadas como un Unix TimeStamp. Esto sería, calcular la media de segundos entre el 01/01/1970 (el cero del UnixTimeStamp) y luego reconvertirlo a fecha del mismo modo.
El problema es que no hay mucha documentación clara del uso del Unix TimeStamp en Access. Diferente sería si hubiese que hacerlo, por ejemplo, en MySQL:
Sobre esta estructura:
Código MySQL:
Ver original
  1. CREATE TABLE  `dias` (
  2.   `FECHA` date default NULL

Tenemos:
Código MySQL:
Ver original
  1. mysql> SELECT * FROM dias d;
  2. +------------+
  3. | FECHA      |
  4. +------------+
  5. | 2010-01-02 |
  6. | 2010-01-02 |
  7. | 2010-01-05 |
  8. | 2010-01-06 |
  9. | 2010-01-09 |
  10. | 2010-01-15 |
  11. | 2010-01-15 |
  12. | 2010-01-16 |
  13. +------------+
  14. 8 rows in set (0.00 sec)

Y probamos:
Código MySQL:
Ver original
  1.     -> FROM DIAS;
  2. +------------+
  3. | Fecha      |
  4. +------------+
  5. | 2010-01-08 |
  6. +------------+
  7. 1 row in set (0.00 sec)
Esto es: La media entre las fechas almacenadas es el 08/01/2010.
Atención : media no es promedio...
Sino la función sería distinta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 23/02/2010, 08:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Hay una posibilidad a considerar, que es calcular la diferencia de fechas tomadas como un Unix TimeStamp. Esto sería, calcular la media de segundos entre el 01/01/1970 (el cero del UnixTimeStamp) y luego reconvertirlo a fecha del mismo modo.
Gracias por la respuesta pero no se muy bien como emplear el ejemplo en mi problema...

Sigo con la función
Cita:
mySQLac9= "SELECT AVG(DAY(DATE()) - DAY(DATE_MESS)),Max(ID_MESSAGE) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART FROM REVERSE where HOLD_STATUS='Ajustado')"
puesto que creo que es lo más cercano a la posible solución que habría, el problema es que la instrucción Max(ID_MESSAGE) no parece que la ejecute y sigue cogiendo todas las fechas y no solo la de las filas más actuales...........

La verdad es que ya no se muy bien que más hacer
  #14 (permalink)  
Antiguo 23/02/2010, 09:20
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Obtener media de fechas

Y sin embargo si hago:

Cita:
mySQLac9= "SELECT Max(ID_MESSAGE) FROM MESSAGES WHERE ID_REVERSE IN (SELECT ID_PART FROM REVERSE where HOLD_STATUS='Ajustado')"
Si obtengo el valor correcto del número de mensaje...... el problema está al unir las dos instrucciones, AVG(DATE-DATE_MESS) y MAX(ID_MESSAGE), parece que como si solo entendiera la primera.

Etiquetas: fechas, media
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 09:58.