Calcular como restar horas y minutos

Me envian unos archivos en txt y lo agrego en dbf entre los campos los guardo y tengo registros de ingreso y salida 08:00 y 12:00 se encuetran de tipo caracter. Necesito restar estas fechas por ejemplo tengo este codigo pero no logro que calcule toda la columna.

Y ahora me doy cuenta que si este cliente ingreso el 31/03/2014 a las 23:49 y se fue el 01/04/2014 a las 17:¿37 cómo debo calcular estas horas..?

mHoraD=val(left(H_INGRESO,2)) mMinuD=val(subst(H_INGRESO,4))
mHoraH=val(left(H_ALTA,2)) mMinuH=val(subst(H_ALTA,4))
mHoraH=iif(mHoraH<mHoraD,mHoraH+24,mHoraH)-iif(mMinuH<mMinuD,1,0) mMinuH=iif(mMinuH<mMinuD,mMinuH+60,mMinuH)
XX=transf(mHoraH-mHoraD,'##')+':'+transf(mMinuH-mMinuD,'##')
REPLACE ESTAN_HOR WITH XX 

1

1 Respuesta

125.550 pts. Me alegra poder estar de regreso. A la orden para sus...

Es un placer saludarte.

Por lo que veo... es algo como un tipo de marcador de personal (entradas - salidas). Por lo general se cuentan los segundos... los segundos se transforman a minutos y los minutos a hora.

¿Cómo es el dato completo de un registro? Osea... en un mismo registro tenes las fechas y horas. ¿Están separados? ¿Están juntos los datos? ¿Son tipo de dato carácter? Para el calculo debes transformar las 2 expresiones (la de entrada y la de salida) en tipo de dato DATETIME() Y luego restar la salida de la entrada para obtener los segundos. Luego transformarlos a minutos, horas o lo que quieras.

Enseñame como es un registro, el tipo de datos, como lo tenes en la tabla... y veo como ayudarte mejor!

Hola Ravenn el gusto es mio gracias, las fechas están separados de las horas de esta manera.

campo, fecha de ingreso = 01/01/2014 (tipo fecha)

campo, fecha de salida = 02/01/2014 (tipo fecha)

campo, hora de ingreso = 18:20 (tipo carácter) no tiene segundos

campo, hora de salida = 20:40 (tipo carácter) no tiene segundos

y muchas gracias por tu ayuda

Un placer saludarte. Me disculpo por la tardanza en responderte.

Arme un pequeño código para dar solución a tu problema. En el, uso una fecha y hora de entrada y uso date() y una hora ejemplo de salida. La forma de presentar el tiempo es en días de 24 horas, con SET HOURS TO 24.

Primero, se obtiene la fecha de entrada y se extraen: año, mes y día. Luego, de la expresión de tiempo (que a como dices es tipo carácter y sin segundos) se extraen las horas y minutos. Como no hay segundos... se establece 0 como segundo. Como están de tipo carácter... las transformamos a tipo numérico con VAL(). El objetivo es armar un cadena tipo DATETIME() que te permita restar el tiempo entre fechas. Así mismo con la hora de salida.

Luego al final, se obtienen los minutos y horas de diferencia. Vos reemplaza las variables donde se asignan las fechas y horas de entrada y salida y el resto dejalo igual. Debe funcionar. Lo probé rapidito y me va bien.

Si los datos están en una tabla, lo mas conveniente es que apliques un SCAN y por cad registro vas reemplazando los datos de fecha y hora de entrada y salida respectivamente y así hasta terminar la tabla. Al final.. en 2 variables se muestran los minutos y horas de diferencia y ya podes usarlas para procesar o guardar en un campo de tipo numérico.

Bien.. acá el código:

SET HOURS TO 24
LOCAL ldEntrada, lnDate, lnTiempoC, lnHoraEntrada, lnHoraSalida, ln1, ln2
LOCAL ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec
**--
LOCAL lnMinutosDif, lnHorasDif
**====================================
**--FECHA INICIAL - MOMENTO DE ENTRADA
**====================================
**--Cargamos la fecha (como ejemplo)
ldEntrada = CTOD('27/04/2014')
**--Extraemos los datos de la fecha
ldAño = YEAR(ldEntrada)
ldMes = MONTH(ldEntrada)
ldDia = DAY(ldEntrada)
**--//
**--CArgamos el tiempo (tipo carácter)
lnTiempoC = "22:50"
**--Extraemos los datos del tiempo
lnHoras = SUBSTR(lnTiempoC, 1, 2)
lnMins = SUBSTR(lnTiempoC, 4, 2)
lnSec = 0
**--Pasamos a numérico
lnHoras = VAL(lnHoras)
lnMins = VAL(lnMins)
**--//
**--Transformamos a datetime
**--la entrada
lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)
*MESSAGEBOX(lnHoraEntrada)
**=================================
**--FECHA FINAL - MOMENTO DE SALIDA
**=================================
**--Cargamos la fecha (usamos DATE como ejemplo)
lnDate = DATE()
**--Extraemos los datos de la fecha
ldAño = YEAR(lnDate)
ldMes = MONTH(lnDate)
ldDia = DAY(lnDate)
**--//
**--CArgamos el tiempo (tipo carácter)
lnTiempoC = "06:13"
**--Extraemos los datos del tiempo
lnHoras = SUBSTR(lnTiempoC, 1, 2)
lnMins = SUBSTR(lnTiempoC, 4, 2)
lnSec = 0
**--Pasamos a numérico
lnHoras = VAL(lnHoras)
lnMins = VAL(lnMins)
**--//
**--Transformamos a datetime
**--la salida.
lnHoraSalida = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)
*MESSAGEBOX(lnHoraSalida)
**--Obtenemos las diferencias en segundos
**--entre las expresiones DATETIME() del momento
**--de entrada y salida.
**--Diferencia en Horas
lnHorasDif = lnHoraSalida - lnHoraEntrada
**
lnHorasDif = (lnHorasDif/60)/60
**--
MESSAGEBOX("Las horas de diferencia son: " + ALLTRIM(STR(lnHorasDif)))
**--Diferencia en minutos
lnMinutosDif = lnHoraSalida - lnHoraEntrada
lnMinutosDif = lnMinutosDif/60
MESSAGEBOX("Los minutos de diferencia son: " + ALLTRIM(STR(lnMinutosDif)))

El código lo pegue en la ventana de escritura pero por alguna razón... el editor de texto de Todoexpertos elimina los espacios en blanco.. por eso se mira todo pegado! Lo siento. Pero va completo.

Avisame si te da algún error o problema y con mucho gusto te ayudare!

Un abrazo!

Desde Managua, capital de Nicaragua!

Ravenn

Ok gracias estoy haciendo las pruebas te aviso cualquier problema y nuevamente gracias amigo

Ok mitchel. Avisame! No se porque rayos mis puntos están bajando tanto y tan rapido hahahahaha!

Un abrazo!

Desde Managua, Nicaragua!

Espero andes bien.

¿Te ha funcionado el código que te envíe? Avisame! Me quede esperando tus comentarios. Avisame si te falló para ver como corregirlo.

Un abrazo! :)

Espero andes bien.
¿Te ha
funcionado el código que te envíe? Avisame! Me quede esperando tus
Comentarios. Avisame si te falló para ver como corregirlo.

Hola no he podido accesar a la pagina de todo experto hasta hoy lo estoy revisando amigo y gracias

Ahh ok mitchel. Lo que pasa es que me quede preocupado... no se si te ha funcionado. ESPERO que si. Avisame cualquier cosa. Me interesa porque subiré esta solución a mi blog y quisiera saber el resultado que te dio.. así ayudamos a otros!

ldEntrada, lo remplace por el nombre del campo de la tabla f_ing_ob

lnHoraEntrada, lo remplace por el nombre del campo de la tabla h_ing_ob

lnHoraSalida, lo remplace por el nombre del campo de la tabla h_sal_ob

guarde todo el programita en un botón de comando, luego lo ejecute y salio error en esta linea.

h_ing_ob = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

Mi pregunta, es correcto lo que hice realizando el cambio de las variables por los nombres de los campos de la tabla y si esta bien me faltaría algo mas.

Disculpa ya lo revisé y realice mal los cambios debería quedar así

**= **--FECHA INICIAL - MOMENTO DE ENTRADA **=

= **--Cargamos la fecha (como ejemplo)

ldEntrada = CTOD(f_ing_ob)

**--CArgamos el tiempo (tipo carácter)

lnTiempoC = "h_ing_ob"

luego

**--FECHA FINAL - MOMENTO DE SALIDA **======

**--Cargamos la fecha (usamos DATE como ejemplo)

lnDate = CTOD(f_sal_ob)

**--CArgamos el tiempo (tipo carácter)

lnTiempoC = "h_sal_ob"

pero igual sigue saliendo el error en esta linea

lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

Esta información debo correrlo en toda la tabla

Proba quitando CTOD aquí:

ldEntrada = CTOD(f_ing_ob)

y aquí:

lnDate = CTOD(f_sal_ob)

Quita el CTOD de ahí... y proba. Si persiste avisame!

Mitchel... ¿cómo se llama el error? ¿Qué te dice el cuadro de dialogo? ¿Datatype mistmatch? Función, ¿argument is invalid?'

ya le quite el CTOD

Cuando quiero guardar para ejecutarlo me sale un mensaje de Error de sintaxis y se posiciona en esta linea

lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

Estoy trabajando con el vfp 5.0

¿Es version 5? Mmmm no estoy del todo claro si la función estaba disponible con todos los argumentos en la V5. Hahaha! Creo que si!

Copia todo el código aquí para inspeccionar mejor. Si el error es por sintaxis es debido a que uno de los argumentos esta introduciéndose a la función de forma errónea.

ok ahí va gracias

SET HOURS TO 24

LOCAL ldEntrada, lnDate, lnTiempoC, lnHoraEntrada, lnHoraSalida, ln1, ln2

LOCAL ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec

**--

LOCAL lnMinutosDif, lnHorasDif

**========= **--FECHA INICIAL - MOMENTO DE ENTRADA

**--Cargamos la fecha (como ejemplo)

ldEntrada = f_ing_ob

**--Extraemos los datos de la fecha

ldAño = YEAR(ldEntrada)

ldMes = MONTH(ldEntrada)

ldDia = DAY(ldEntrada)

**--//

**--CArgamos el tiempo (tipo carácter)

lnTiempoC = "h_ing_ob"

**--Extraemos los datos del tiempo

lnHoras = SUBSTR(lnTiempoC, 1, 2)

lnMins = SUBSTR(lnTiempoC, 4, 2)

lnSec = 0

**--Pasamos a numérico

lnHoras = VAL(lnHoras)

lnMins = VAL(lnMins)

**--// **--Transformamos a datetime

**--la entrada

lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

*MESSAGEBOX(lnHoraEntrada)

**============== **--FECHA FINAL - MOMENTO DE SALIDA

**--Cargamos la fecha (usamos DATE como ejemplo)

lnDate = f_sal_ob

**--Extraemos los datos de la fecha

ldAño = YEAR(lnDate)

ldMes = MONTH(lnDate)

ldDia = DAY(lnDate)

**--CArgamos el tiempo (tipo carácter)

lnTiempoC = "h_sal_ob"

**--Extraemos los datos del tiempo

lnHoras = SUBSTR(lnTiempoC, 1, 2)

lnMins = SUBSTR(lnTiempoC, 4, 2)

lnSec = 0

**--Pasamos a numérico

lnHoras = VAL(lnHoras)

lnMins = VAL(lnMins)

**--Transformamos a datetime

**--la salida.

lnHoraSalida = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

*MESSAGEBOX(lnHoraSalida)

**--Obtenemos las diferencias en segundos

**--entre las expresiones DATETIME() del momento

**--de entrada y salida.

**--Diferencia en Horas

lnHorasDif = lnHoraSalida - lnHoraEntrada

**

lnHorasDif = (lnHorasDif/60)/60

**--

MESSAGEBOX("Las horas de diferencia son: " + ALLTRIM(STR(lnHorasDif)))

**--Diferencia en minutos

lnMinutosDif = lnHoraSalida - lnHoraEntrada

lnMinutosDif = lnMinutosDif/60

MESSAGEBOX("Los minutos de diferencia son: " + ALLTRIM(STR(lnMinutosDif)))

Mmmm no veo donde haces referencia a la tabla. Veo que cargas

ldEntrada = f_ing_ob

y

lnTiempoC = "h_ing_ob"

¿Esos son campos de la tabla? Si son campos no debes ponerlos "" entre comillas.

Primero hace selección a la tabla

SELECT tabla 1

GO TOP

Antes de cargar las variables con los campos de la tabla y quita las comillas del otro campo. La mejor forma es:

ldEntrada = tabla.f_ing_ob

Haciendo referencia a la tabla.

Proba y me avisas.

Cuando quiero guardar para ejecutarlo me sale un mensaje de Error de sintaxis y se posiciona en esta linea
lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)

estuve revisando y cuando coloco esta variable en la ventana de comando

? ldEntrada = EMERGE.f_ing_ob

sale .T. parece que no esta tomando los registros de la tabla, amigo una pregunta yo necesito realizar este procedimiento para todos los registros que tengo en mi tabla. se podrá hacerlo de esa manera.

No entiendo porque surge ese error. Mira... si se puede hacer lo que necesitas. Basta aplicar un escaneo a la tabla y por cada registro ir procesando.

Hagamos algo! Para poder solucionarte, debo ver la tabla y probar que esta saliendo mal. Si quieres enviame la tabla por correo para ver que es lo que esta pasando.

Solo la tabla y me decís que campos son los que se evaluaran. Yo armaré el código y veré si es un problema de tipo de datos.

Escribime a

[email protected]

Cerra ésta consulta y nos quedamos por el email en comunicación.

Un abrazo! :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas