Como sacar promedio de una columna calculada en consulta access delimitanda por 2 fechas

Estoy buscando hacer una consulta en la que me diga el tiempo promedio que tardo en terminar mi proceso.

Tengo la tabla [TDelivery] con las columnas (Esatus), (Inicio), (Fin), (Diferencia).

En el campo (Diferencia), tengo cuanto tiempo tardo en minutos desde el inicio hasta el fin (Diferencia: DateDiff('n',[Inicio],[Fin])).

Lo que busco obtener es el promedio de minutos que tardo en iniciar hasta cerarr mi proceso, tomando en cuenta solo los registros que tengasn el (Estatus)=Cerrado y los registros del dia actual, cabe señalar que en mi tabla el formato de la columna (inicio) y la columna (fin) son dd/mm//yyyy hh:mm:ss a.m/p.m

Intente colocando solo Date() en la columna Fin pero no funciono.

2 respuestas

Respuesta
2

Si tus campos inicio y fin incluyen la hora, y como criterio solo pones una fecha ( sin hora), nunca te va a encontrar una coincidencia, pues, por ejemplo #18/06/2020 15:30:45# no es igual que #18/06/2020#

Para filtrar tu consulta, crear un nuevo campo ( que puedes dejar oculto) que te coja solo la parte de la, y asi ya podrás usar como criterio Date().

Por ejemplo puedes crear ese campo como Format([Fin],"dd/mm/yyyy"), lo agrupas como Expresión y en criterio le pones Date()

Respuesta
1

Lo que en código sería sencillísimo en SQL es más latoso. Si tengo la tabla

Construyo la consulta

Con lo que si la abro me quedan sólo los Cerrados, y no te molestes en ponerle lo de Avg, ni nada porque cada registro es distinto y no los puede agrupar, por eso te decía que en código es mucho más sencillo. Además aunque pusieras Date() o Now(), no te serviría, tendrías que añadirle un campo, por ejemplo

FechaFin:Int([fin]), entonces si podrías poner debajo, en la casilla criterio

Date() Luego te explico porqué.

Con esta consulta 1 hago la consulta 2, 

Cuando la abro, como en la consulta anterior ya habría limitado los registros a los de la fecha del sistema, en ésta ya me sale el promedio del día

Mira, te decía lo de las fechas y las horas, porque ningún ordenador del mundo trabaja con fechas, trabaja con números. Al día 31/12/1899 se le asignó el 0, al 01/01/1900 el 1, y así hasta hoy. Las fechas son números enteros y las horas son decimales de día

Jodida casualidad que estamos en el dia 44000 desde el 1 de Enero de 1900

Entonces si le pusieras como criterio a lo de abajo 44000 no te sacaría nada, porque habría que tener en cuenta los decimales. Por eso te decía que "usaras" la parte entera de del valor real del FIN.

Julián,

Como siempre gracias, (te respondo antes de analizar lo que me mandaste)

La verdad es que la idea es meter código, la manera en que voy creando mi código (no se si estoy bien) es que primero hago la consulta en Access y después la paso a código, primero para daré una idea y segundo para ver la estructura.

Ahora ya tengo mi código

SELECT Avg(DateDiff('n',[Inicio],[Fin])) AS Diferencia
FROM TDelivery
HAVING (((TDelivery.Estatus_Pick)="Cerrado") AND ((TDelivery.Fecha_Asignacion)=Date()));

Pero tengo el problema de que no puedo aplicarlo alcual al Control Source y no puedo nada mas asignar esta cadena a mi cuadro de texto algo asi:

Me.Text72 = "SELECT Avg(DateDiff('n',TDelivery.[Inicio],TDelivery.[Fin])) AS Diferencia FROM TDelivery HAVING (((TDelivery.Estatus_Pick)='Cerrado') AND ((TDelivery.Fecha_Asignacion)=Date()))"

Por lo que apenas estoy buscando como asignar el valor.

Revisando un correo que me mandaste, me recomiendas no utilizar expresiones tipo Dim rs as Recordset, por puro ejemplo y apenas investigando y para probando, realice el siguiente código y ya estoy obteniendo resultados, pero no se cual seria la manera más eficiente de hacer el código.

Dim rs As Recordset, X As Double
Set rs = CurrentDb.OpenRecordset("SELECT Avg(DateDiff('n',TDelivery.[Inicio],TDelivery.[Fin])) AS Diferencia FROM TDelivery HAVING (((TDelivery.Estatus_Pick)='Cerrado') AND ((TDelivery.Fecha_Asignacion)=Date()))")
X = rs!Diferencia
Me.Text72 = Format(X, "000.00")
rs.Close
Set rs = Nothing

Voy a tratar de ser lo más claro posible. Supongamos que tengo la tabla Tabla 1 a la que le he añadido un campo Diferencia, que no sería necesario pero que he puesto simplemente para que puedas comprobar los números.

Tengo el formulario basado en esta tabla pero podría ser en cualquier otro, ya que no hago referencia ninguna a él, pero lo pongo por lo mismo, para que puedas comprobar, donde le he puesto un combinado ElegirDia, para que se haga precisamente eso y un cuadro de texto Promedio donde me va a dar el promedio del tiempo empleado en el día que elija

Si elijo el 19/06/2020

Puedes comprobarlo, ya que ese día sólo hay dos registros "Cerrados"

El origen de la fila del combinado Elegir día es

SELECT Fix([fin]) AS Dia FROM Tabla1 GROUP BY Fix([fin]); y al campo de la consulta le he dado el formato Fecha Corta

Lo de fix es para que extraiga la parte entera de FIN

El código del evento Después de actualizar del combinado ElegirDia es

Private Sub ElegirDia_AfterUpdate()
Promedio = DSum("datediff(""n"",inicio,fin)", "tabla1", "fix([inicio])=fix(forms!tabla1!elegirdia) and estatus=""Cerrado""") / DCount("*", "tabla1", "fix([inicio])=fix(forms!tabla1!elegirdia) and estatus=""Cerrado""")
End Sub

¡Gracias!

¡ Una linea de codigo! muchas gracias, ahora comprendo y entiendo la funcion Fix y la funcion Int.

Excelente tu explicacion me ha funcionado de maravilla.

Nota. alguna pagina o libro que me recomiendes para mejorar mis habilidades en Access?

Saludos

En Internet tienes varios foros de Access. Este es muy bueno, pero tiene el inconveniente que no pone imágenes

http://www.mvp-access.com/foro/

Yo recuerdo los tiempos duros de ésta propia página cuando no se podían poner imágenes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas