Calcular medias horas en un rango de fechas

Es un sistema de parqueo y quisiera saber como calcular medias horas de un rango de fechas, esto quiere decir que pueden ser varios días ya que es para un hospital, muchas gracias.

Respuesta
1

Hola stilmar! Un placer saludarte de nuevo.

Espero poder ayudarte. Te pido si que seas un poco más especifico en tu requerimiento, dado que no comprendo muy bien como es el calculo que deseas hacer.

Un abrazo!

Desde Managua, Nicaragua!

¡Gracias! 

Buenos días por ejemplo.

Hoy entra un carro a nuestro parqueo fecha 15/10/2014 a las 8:45 y salí hoy mismo a las 23:20 quiero saber cuantas medias horas hay entre ese rango de horas de 8:45 a 23:20 ya que cada media hora tiene un costo.

Ahora si esta más claro. Pregunta clara... respuesta clara: Te daré una posible respuesta a modo que probes. Luego vos adecua el código a tu conveniencia.

1 - Crea un formulario y agregale: 2 textboxs. En el text1 cargaras un valor DATETIME() de la hora de entrada del vehículo. En el Text2 el valor DATETIME() de la salida. De modo que el formato sera la fecha/hora (15/10/2014 12:45:56). Agrega dos botones. Uno sera para darle click cuando el vehículo entre y así grabar la hora en el text1 y el otro para dar click cuando el vehículo salga y grabar la fechahora en el text2.

Agrega un tercer botón y aquí programaremos el código para recuperar cuantas medias horas han transcurrido entre las 2 horas.

2 - En el evento click del botón 1 (que servirá para agregar la hora de entrada al text1) coloca esto:

THISFORM.Text1.Value = DATETIME()
THISFORM.Text1.REFRESH

**--//

3 - En el evento click del botón 2 (que servirá para agregar la hora de salida en el text2) coloca esto:

THISFORM.Text2.Value = DATETIME()
THISFORM.Text2.REFRESH

**--//

4 - En el evento INIT() del formulario, coloca esto:

**--Apagamos conversacion eco de foxpro
SET TALK OFF

**--Cambiamos la forma de ver horas a tipo 24
SET HOURS TO 24
**--Tipo de fecha inglesa/hispana
SET DATE BRITISH
**--
THISFORM.AutoCenter = .T.

5 - En el evento click del botón 3 que es donde generaras el calculo, coloca este código:

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('15/10/2014')
ldEntrada = DTOC(THISFORM.Text1.Value)
ldEntrada = CTOD(ldEntrada)
**--Extraemos los datos de la fecha
ldAño = YEAR(ldEntrada)
ldMes = MONTH(ldEntrada)
ldDia = DAY(ldEntrada)
**--//
**--CArgamos el tiempo (tipo caracter)
**lnTiempoC = "8:00"
lnTiempoC = SUBSTR(TTOC(THISFORM.Text1.Value), 10, 5)
**--Extraemos los datos del tiempo
lnHoras = SUBSTR(lnTiempoC, 1, 2)
lnMins = SUBSTR(lnTiempoC, 4, 2)
lnSec = 0
**--Pasamos a numerico
lnHoras = VAL(lnHoras)
lnMins = VAL(lnMins)
**--//
**--Transformamos a datetime
**--la entrada
lnHoraEntrada = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)
**=================================
**--FECHA FINAL - MOMENTO DE SALIDA
**=================================
**--Cargamos la fecha (usamos DATE como ejemplo)
*lnDate = DATE()
lnDate = DTOC(THISFORM.Text2.Value)
lnDate = CTOD(lnDate)
**--Extraemos los datos de la fecha
ldAño = YEAR(lnDate)
ldMes = MONTH(lnDate)
ldDia = DAY(lnDate)
**--//
**--CArgamos el tiempo (tipo caracter)
*lnTiempoC = "23:00"
lnTiempoC = SUBSTR(TTOC(THISFORM.Text2.Value), 10, 5)
**--Extraemos los datos del tiempo
lnHoras = SUBSTR(lnTiempoC, 1, 2)
lnMins = SUBSTR(lnTiempoC, 4, 2)
lnSec = 0
**--Pasamos a numerico
lnHoras = VAL(lnHoras)
lnMins = VAL(lnMins)
**--//
**--Transformamos a datetime
**--la salida.
lnHoraSalida = DATETIME(ldAño, ldMes, ldDia, lnHoras, lnMins, lnSec)
**--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)))
**--Diferencias en medias horas
lnMediasHoras = lnHorasDif * 2
MESSAGEBOX("Las medias horas completas transcurridas han sido: " + ALLTRIM(STR(lnMediasHoras)))

Luego guarda los cambios y ejecuta. Marca el primer botón con click y veras el DATETIME en el text1. Esa es tu hora de entrada. Anda al reloj de tu pc (para no tener que esperar) y adelanta unas horas el reloj. Guarda la hora y regresa al form y marca el click del botón 2 y veras la hora de salida.

Luego da click en el 3 botón y te enviara unos mensajes con la diferencia en horas, minutos y cuantas medias horas han transcurrido. En el código del botón 3 esta todo el cerebro. Ahí esta el calculo del tiempo y las variables que almacenan los resultados. A vos te debería interesar la variable lnMediasHoras que es la que almacena cuantas medias horas han transcurrido.

Ahora solo adecua el código a tus necesidades respetando los datos.

Cualquier cosa, avisame para ayudarte. No olvides puntuar la pregunta. Estoy a la orden para ayudarte en lo que sea.

Un abrazo!

Desde Managua, Nicaragua!

Ravenn :D :D :D

1 respuesta más de otro experto

Respuesta
1
¿

? ROUND((datetime(2014,10,16,40,0)-datetime(2014,10,14,00,00)+900)1800,0)

Lo que haces es sacar la diferencia de horas en segundos, después le sumas 900 segundos a tu resultado (para que si teda 2 medias horas 10 minutos te los redonde a 3 medias horas), lo divides entre 1800 segundos (el equivalente a 30 minutos) y al final lo redondeas, así como esta la función lo que te devuelve es 6 medias horas.

Ok error ortográfico, esta sería la función completa y la explicación.

ROUND(((DATETIME(2014,10,16,14,0,0)-DATETIME(2014,10,14,16,0,0)+899)/1800), 0)

La fecha de salida - la fecha de entrada + 899 (15 minutos -un segundo) para que el redondeo siempre sea a la siguiente media hora, sobre 1800 segundos (30 minugos) y el resultado final lo redondeamos a 0 decimales, la función es más o menos parecida a sacar el cobro de minutos de una llamada.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas