Lo primero disculpad que el mensaje se un poco "ladrillo", pero me
pareció la forma más clara de exponer el problema que tengo cuando
intento pasar un campo "segundos" a "hh:mm:ss"
Os resumo el punto en el que me encuentro:
Tengo dos tablas que vinculo desde dos hojas Excel. En una de ellas se
incluyen los codigos de usuario, fecha de alta y fecha de baja. En
otra tabla hay un campo c_usuario que hace referencia a cada usuario y
tres campos más que determinan la duración de cada vez que se uso la
máquina: campo horas, campo minutos y campo segundos.
La consulta que quiero obtener ha de ordenar los usuarios que han
usado las máquinas por tiempo total que la han usado dicha máquina.
Mi idea era pasarlo todo a segundos para luego convertirlo en hh:mm:ss
en un solo campo y ordenar. La conversión la hice creando un campo
"tiempol" como sigue:
---------------------------------------------------------------------------------------
tiempo: SerieHora(([uso]![tiempo en segundos]/3600);([uso]![tiempo en
segundos]/60) Mód 60;([uso]![tiempo en segundos] Mód 60))
---------------------------------------------------------------------------------------
El caso es que no funciona bien, puesto que si la unidad mayor
equivale a un número con parte decimal mayor que 0,5 aproxima al
entero mayor. Pongo un ejemplo del resultado obtenido para que se
entienda:
TABLA VINCULADA
usuario horas minutos segundos
U001 0 1 87
U002 1 56 5
CONSULTA REALIZADA EN SEG
usuario total segundos
U001 147
U002 6965
CONSULTA CONVERSION hh:mm:ss
usuario tiempo
U001 00:02:27
U002 02:56:05
Como podeis ver el usuario U001 lo calcula bien puesto que 87 segundos
son 1,45 min y por lo tanto aproxima a 1. En cambio U002 calcula 56
minutos como 0,93 horas y aproxima a 1 hora.
¿Teneis alguna solución para que no haga esto? O si no a ver si me
podeis indicar alguna manera de hacer este traspaso.
Gracias de antemano y otra vez disculpas por lo largo del mensaje,
Un saludo,
ZAP
tiempo: CFecha([tiempo en segundos]/86400)
También te puodrías crear una función que lo haga
Si quieres que te devuelva una Cadena
Public Function Tiempo_hms(ByVal Segundos As Double) As String
Const SegundosDia As Long = 86400
Tiempo_hms= Format(Segundos / SegundosDia, "hh:nn:ss")
End Function
Luego la puedesllamar desde la consulta así
tiempo: Tiempo_hms([uso]![tiempo en segundos])
Puedes usar la cadena devuelta como criterio de ordenación
Si en vez de una cadena quieres usar un valor de tipo Fecha/Hora, puedes
hacer
tiempo: CFecha(Tiempo_hms([uso]![tiempo en segundos]))
ó
tiempo: CFecha([tiempo en segundos]/86400)
ó cambiar la función a esta manera
Public Function Tiempo_hms(ByVal Segundos As Double) As Date
Const SegundosDia As Long = 86400
Tiempo_hms= Segundos / SegundosDia
End Function
Ojo que estas funciones no te darán el resultado apetecido si usas valores
de segundos superiores a 86399 ó 23:59:59, aunque por la naturaleza de tu
problema se supone que nadie va a estar conectado más de 24 horas, ¿o sí?...
Saludos desde la calle Estafeta de Pamplona:
Eduardo Olaz
Microsoft [MVP] Access
eduardoALGARROBAolaz.net
ALGARROBA = @
"Z4P" <Z...@Z4P.14> escribió en el mensaje
news:abtkn09pc5fjo6nih...@4ax.com...
¿has mirado la función TimeSerial?, creo que te evitaría el paso intermedio
Saludos a tod@s desde Huelva
Emilio
miliuco56 ALGARROBA hotmail.com
Reglas de conducta de los grupos de noticias:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
"Z4P" <Z...@Z4P.14> escribió en el mensaje
news:abtkn09pc5fjo6nih...@4ax.com...
CampoFechaHora = Timeserial ([CampoHoras],[CampoMinutos],[Camposegundos])
Si sólo tienes los segundos y no tienes más de 32767, es decir el máximo que
admite un número entero, unas 9 horas, puedes usar:
CampoFechaHora = Timeserial (0,0,[Camposegundos])
--
Saludos.
José Bengoechea Ibaceta [MS-MVP Access]
http://perso.wanadoo.es/j.bchea
"Z4P" <Z...@Z4P.14> escribió en el mensaje
news:abtkn09pc5fjo6nih...@4ax.com...
Ante todo muchas gracias por lo rápido y completo de tu respuesta.
Me comentabas que las formulas no sirven para más de 23:59:59. ¿Con
eso te refieres también a la que devuelve una cadena?
>Public Function Tiempo_hms(ByVal Segundos As Double) As String
> Const SegundosDia As Long = 86400
> Tiempo_hms= Format(Segundos / SegundosDia, "hh:nn:ss")
>End Function
En principio no sé cuanto tiempo se van a usar ni, aún más importante,
con que frecuencia van a pedir el acumulado de uso. Es decir, si el
total de uso por persona me lo piden mensual... pues es posible que
pase de 24 horas. :-(
Gracias de nuevo y un saludo,
ZAP
Puedes usar esta función
____________________________________________________
Public Function Tiempo_dhms(ByVal Segundos As Double) As String
Dim strDias As String
Const SegundosDia As Long = 86400
' Si el tiempo es mayor que un día
If Segundos > SegundosDia Then
strDias = Format(Int(Segundos / SegundosDia), "00") & "d "
Segundos = Segundos Mod SegundosDia
End If
Tiempo_dhms = strDias & Format(Segundos / SegundosDia, "hh:nn:ss")
End Function
____________________________________________________
Por ejemplo para 185000 segundos devuelve
02d 03:23:20
Para 18500 segundos devuelve
05:08:20
Saludos desde la calle Estafeta de Pamplona:
Eduardo Olaz
Microsoft [MVP] Access
eduardoALGARROBAolaz.net
ALGARROBA = @
"Z4P" <Z...@Z4P.14> escribió en el mensaje
news:ahhln09up7bsj213b...@4ax.com...
Tienes razón, añadiendo int se soluciona el problema de las
aproximaciones. Pero he hecho un cambio y tambien se lo he añadido a
los minutos. De otra forma tenía el mismo problema cuando eran menso
de 60 minutos.
tiempo: SerieHora(int(([uso]![tiempo en segundos]/3600));O
Int(([uso]![tiempo en segundos]/60)) Mód 60;([uso]![tiempo en
segundos] Mód 60))
De todas formas, sigue teniendo el problema de las duraciones totales
mayores de 24 horas. Lo mismo me pasaría con Timeserial que me
proponian Chea y Emilio (gracias a los dos también), así que me parece
que lo más adecuado será la función de Eduardo.
Un saludo a todos,
ZAP
creo que has dado en el clavo. He hecho una pequeña variación para
poder ordenar lor resultados. He añadido un 'else' al condicional como
sigue:
Public Function Tiempo_dhms(ByVal Segundos As Double) As String
Dim strDias As String
Const SegundosDia As Long = 86400
' Si el tiempo es mayor que un día
If Segundos > SegundosDia Then
strDias = Format(Int(Segundos / SegundosDia), "00") & "d "
Segundos = Segundos Mod SegundosDia
Else
strDias = "00" & "d "
End If
Tiempo_dhms = strDias & Format(Segundos / SegundosDia, "hh:nn:ss")
End Function
Así me pondrá 00d en todos los menores de un día, pero por lo menos
puedo ordenarlo por este campo.
Un saludo,
ZAP
On Sat, 23 Oct 2004 23:53:36 +0200, "Eduardo Olaz"
Public Function Tiempo_Dhms(ByVal Segundos As Double) As String
Dim strDias As String
Const SegundosDia As Long = 86400
strDias = Format(Int(Segundos / SegundosDia), "00") & "d "
Segundos = Segundos Mod SegundosDia
Tiempo_Dhms = strDias & Format(Segundos / SegundosDia, "hh:nn:ss")
End Function
Saludos desde la calle Estafeta de Pamplona: