Cómo restar horas en foxpro

download Cómo restar horas en foxpro

of 9

Transcript of Cómo restar horas en foxpro

Cmo restar horas en foxpro?HOla porfa necesito saber como restar horas en VFP por ejm: Hora de Salida menos Hora de Entrada gracias

hace 4 aos Notificar un abuso

Arom

Mejor respuesta - Elegida por la comunidadFunciones FECHA en FOX La funcin DATE() nos retorna la fecha actual del sistema si se ejecuta sin argumentos. Para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la funcin DATE(nAnio,nMes,nDia) con sus argumentos para crear expresiones de tipo Date. dFecha = DATE() && Fecha actual del sistema dFecha = DATE(2000,03,01) && 1 de Marzo de 2000 La diferencia entre dos expresiones de tipo Date nos retorna el nmero de das transcurridos entre ambas fechas. ? DATE(2004,12,31) - DATE(2004,1,1) Si se suman o restan cantidades numricas de das a una expresin de tipo Date, el resultado es otra expresin de tipo Date. ? DATE() + 7 && La fecha actual mas 7 das ? DATE() - 15 && La fecha actual menos 15 das La funcin DATETIME() nos retorna la fecha y hora actual del sistema si se ejecuta sin argumentos. Al igual que la funcin DATE() y para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la funcin DATETIME(nAnio,nMes,nDia,nHoras,nMinutos con todos sus argumentos para crear expresiones de tipo DateTime. tFHora = DATETIME() && Fecha y hora actual del sistema

tFHora = DATETIME(2000,03,01,16,15,30) && 1 de Marzo de 2000, 16:15:30 horas La diferencia entre dos expresiones de tipo DateTime nos retorna el nmero de segundos transcurridos entre ambas fechas y horas. ? DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0) NOTA: Debido a un bug con el redondeo en las fracciones de segundos en variables del tipo DateTime es conveniente redondear las diferencias de estas variables con ROUND(lnSeg,0) ? ROUND(DATETIME(2004,12,31,23,59,59) - DATETIME(2004,12,31,6,0,0), 0) Si se suman o restan cantidades de segundos a una expresin de tipo DateTime, el resultado es una expresin de tipo DateTime. ? DATETIME() + 60 && Fecha y hora actual mas 60 segundos ? DATETIME() - 3600 && Fecha y hora actual menos 3600 segundos Si deseamos generar expresiones Date y DateTime "vacas" lo hacemos de la siguiente manera: dFecha = {} && Expresion Date vacia dFecha = {//} && Expresion Date vacia tFHora = {/:} && Expresin DateTime vacia tFHora = {//::} && Expresin DateTime vacia En estos ltimos ejemplos, se debe tener en cuenta que la mayora de los servidores de bases de datos no trabaja con el concepto de fechas "vacas" como lo hace Visual FoxPro. En estos casos se debe utilizar fechas nulas debido a que se tendrn fechas incoherentes y/o no esperadas. dFecha = .null. tFHora = .null. Funciones con expresiones Date y DateTime Se pueden convertir expresiones de tipo Date a DateTime y viceversa con las funciones DTOT() y TTOD() respectivamente. En el caso de la funcin DTOT() (al igual que si omitimos los argumentos de horas en la funcin DATETIME(nAnio,nMes,nDia)) la hora se sustituye por 00:00:00 (12:00:00AM). dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? DTOT(dFecha) ? TTOD(tFHora)

Las siguientes funciones de Visual FoxPro sirven para poder extraer algunos valores de las expresiones Date y DateTime, como el ao, el mes, el da, la semana, etc. dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? YEAR(dFecha) && Ao de una expresin Date o DateTime ? MONTH(tFHora) && Mes de una expresin Date o DateTime ? DAY(dFecha) && Da de una expresin Date o DateTime ? HOUR(tFHora) && Horas de una expresin DateTime ? MINUTE(tFHora) && Minutos de una expresin DateTime ? SEC(tFHora) && Segundos de una expresin DateTime ? DOW(dFecha) && Nmero del da de la semana de una expresin Date o DateTime ? WEEK(dFecha) && Nmero de semana del ao de una expresin Date o DateTime ? QUARTER(tFHora) && Trimestre del ao de una expresin Date o DateTime Todas las funciones anteriores retornan valores numricos. Otras funciones de Visual FoxPro retornan cadenas de caracteres a partir de expresiones Date o DateTime, como por ejemplo: dFecha = DATE(2004,06,03) tFHora = DATETIME(2004,05,18,11,30,45) ? CMONTH(dFecha) && Nombre del mes de una expresin Date o DateTime ? CDOW(tFHora) && Nombre del da de la semana de una expresin Date o DateTime ? DMY(tFHora) && Cadena con el formato da-mes-ao de una expresin Date o DateTime ? MDY(tFHora) && Cadena con el formato mes-da-ao de una expresin Date o DateTime ? TTOC(tFHora) && Convierte una expresin DateTime a caracter ? DTOC(dFecha) && Convierte una expresin Date a caracter Para retornar una cadena de caracteres solo con la hora de una variable DateTime se utiliza la funcin TTOC() con el segundo parmetro igual a 2. ? TTOC(DATETIME(),2) En Visual FoxPro se puede retornar una fecha con "n" meses anteriores o posteriores de una expresin Date o DateTime con la funcin GOMONTH(). ? GOMONTH(DATE(),3) && Tres meses despus a partir de la fecha actual ? GOMONTH(DATETIME(),-12) && Doce meses anteriores a partir de la fecha y hora actual

Otras funciones con argumentos de expresiones Date y DateTime Existen otras funciones en Visual FoxPro que reciben como argumento expresiones de tipo Date y DateTime, y retornan valores lgicos, Date o DateTime. dFecha0 = {} dFecha1 = DATE(2004,1,1) dFecha2 = DATE(2004,12,31) dFecha3 = .null. *-- Retorna .T. si una fecha es "vacia" ? EMPTY(dFecha0) *-- Retorna .T. si una fecha es "nula" ? ISNULL(dFecha3) *-- Retorna .T. si la 1 expresin est dentro de los valores 2 y 3 ? BETWEEN(DATE(),dFecha1,Dfecha2) *-- Retorna .T. si la expresin 1 coincide con alguna de la lista ? INLIST(DATE(2004,1,1),dFecha0,dFecha1,dF *-- Retorna la expresin Date o DateTime con valor mnimo ? MIN(dFecha1,dFecha2) *-- Retorna la expresin Date o DateTime con valor mximo ? MAX(dFecha0,dFecha1,dFecha2) Mas funciones de tiempo Visual FoxPro posee las siguientes funciones referidas a tiempo: TIME() retorna la hora actual del sistema en formato de 24 horas en una cadena de 8 caracteres con el formato "HH:MM:SS". Al retornar una cadena de caracteres no se pueden realizar operaciones aritmticas con estos valores. ? TIME() && Hora actual del sistema SECONDS() retorna el nmero de segundos pasados desde la medianoche. Se puede utilizar para medir intervalos cortos de tiempo en un proceso. Recordar que este valor vuelve a 0 (cero) a partir de la medianoche. nSegundos = SECONDS() FOR nI = 1 TO 3 INKEY(1) ENDFOR ? SECONDS() - nSegundos, "segundos transcurridos" SYS(1) retorna una cadena de caracteres con el nmero de da Juliano de la fecha actual del sistema. SYS(10,nDiaJuliano) retorna una cadena de caracteres con la fecha correspondiente al da Juliano pasado como parmetro.

SYS(11,dFecha) retorna una cadena de caracteres con el nmero de da Juliano de la fecha pasada como parmetro. ? SYS(1) ? SYS(10,VAL(SYS(1))) ? SYS(11,DATE(2005,1,1)) Los valores vlidos en Visual FoxPro para los das das del calendario Juliano estn comprendidos entre el 14 de Setiembre de 1752 y el 31 de Diciembre de 9999. Funciones definidas por el usuario A continuacin describiremos diversas funciones definidas por el usuario (UDF) que utilizan las funciones nativas de Visual FoxPro descriptas al comienzo de este artculo, que nos permiten trabajar con expresiones Date y DateTime. Esta funciones estn publicadas en PortalFox y algunas fueron ligeramente modificadaspara este este artculo. ltimo da del mes: Esta funcin retorna la fecha del ltimo da del mes de una expresin Date o DateTime pasada como parmetro. ? EoM(DATE()) FUNCTION EoM(tdFecha) LOCAL ld ld = GOMONTH(tdFecha,1) RETURN ld - DAY(ld) ENDFUNC Primer da del mes: Esta funcin retorna la fecha del primer da del mes de una expresin Date o DateTime pasada como parmetro. ? BoM(DATE()) FUNCTION BoM(tdFecha) RETURN DATE(YEAR(tdFecha),MONTH(tdFecha),1) ENDFUNC Cantidad de das de un mes: Esta funcin retorna la cantidad de das que tiene el mes de una expresin Date o DateTime pasada como parmetro. ? DiasDelMes(DATE(2004,2,1)) FUNCTION DiasDelMes(tdFecha) LOCAL ld ld = GOMONTH(tdFecha,1) RETURN DAY(ld - DAY(ld)) ENDFUNC Edad de una persona: Calcula la edad de una persona pasando como parmetros la

fecha de nacimiento y la fecha a la cual calculamos la edad. Si no se pasa el segundo parmetro se toma por defecto la fecha actual. ? Edad(DATE(2000,3,1)) FUNCTION Edad(tdNac, tdHoy) LOCAL lnAnios IF EMPTY(tdHoy) tdHoy = DATE() ENDIF lnAnios = YEAR(tdHoy) - YEAR(tdNac) IF GOMONTH(tdNac, 12 * lnAnios) > tdHoy lnAnios = lnAnios - 1 ENDIF RETURN lnAnios ENDFUNC Diferencia entre dos fechas en aos, meses y das: Calcula la cantidad de aos, meses y das entre dos expresiones de tipo Date pasadas como parmetros. (esta funcin utiliza la UDF DiasDelMes()). ? Diferencia_AMD(DATE(2000,3,1), DATE()) FUNCTION Diferencia_AMD(tdIni, tdFin) LOCAL ldAux, lnAnio, lnMes, lnDia, lcRet *--- Fecha inicial siempre menor IF tdIni > tdFin ldAux = tdIni tdIni = tdFin tdFin = ldAux ENDIF lnAnio = YEAR(tdFin) - YEAR(tdIni) ldAux = GOMONTH(tdIni, 12 * lnAnio) *--- No cumplio el ao aun IF ldAux > tdFin lnAnio = lnAnio - 1 ENDIF lnMes = MONTH(tdFin) - MONTH(tdIni) IF lnMes < 0 lnMes = lnMes + 12 ENDIF lnDia = DAY(tdFin) - DAY(tdIni) IF lnDia < 0 lnDia = lnDia + DiasDelMes(tdIni) ENDIF *--- Si el dia es mayor, no cumplio el mes IF (DAY(tdFin) < DAY(tdIni)) IF lnMes = 0 lnMes = 11

ELSE lnMes = lnMes - 1 ENDIF ENDIF lcRet = ALLTRIM(STR(lnAnio))+ " aos, " + ; ALLTRIM(STR(lnMes))+ " meses y " + ; ALLTRIM(STR(lnDia))+ " das" RETURN lcRet ENDFUNC Diferencias entre dos variables DateTime: Calcula la cantidad de das, horas, minutos y segundos entre dos expresiones DateTime pasadas como parmetros. ? Diferencia_DHMS(DATETIME(2000,3,1,12,10, FUNCTION Diferencia_DHMS(ttIni,ttFin) LOCAL ln, lnDia, lnHor, lnMin, lnSeg IF EMPTY(ttFin) ttFin = DATETIME() ENDIF ln = ttFin - ttIni lnSeg = MOD(ln,60) ln = INT(ln/60) lnMin = MOD(ln,60) ln = INT(ln/60) lnHor = MOD(ln,24) lnDia = INT(ln/24) RETURN ALLTRIM(STR(lnDia))+ " das, "+ ; TRANSFORM(lnHor, "@L 99")+ " horas, "+ ; TRANSFORM(lnMin, "@L 99")+ " minutos, "+ ; TRANSFORM(lnSeg, "@L 99")+ " segundos" ENDFUNC Segundos a hora: Transforma una cantidad de segundos pasados como parmetro al formato hora "HH:MM:SS". Con esta funcin podemos transformar la cantidad de segundos devueltos de una diferencia de dos expresiones DateTime. lnSeg = DATETIME() - DATETIME(2004,3,1,12,10,05) ? Seg2Hor(lnSeg) FUNCTION Seg2Hor(tnSegundos) LOCAL lnHoras, lnMinutos, lnSegundos lnHoras = INT(tnSegundos/3600) lnMinutos = INT(((tnSegundos-(lnHoras*3600))/60)) lnSegundos = MOD(tnSegundos,60) RETURN IIF(lnHoras < 100,TRANSFORM(lnHoras,"@L 99"),ALLTRIM(STR(lnHoras))) + ; ":" + TRANSFORM(lnMinutos,"@L 99") + ; ":" + TRANSFORM(lnSegundos,"@L 99")

ENDFUNC Validar una fecha: Retorna verdadero si la fecha (ao,mes,da) pasada como parmetro es vlida. ? EsFechaValida(2004,2,30) FUNCTION EsFechaValida(tnAnio, tnMes, tnDia) RETURN ; VARTYPE(tnAnio) = "N" AND ; VARTYPE(tnMes) = "N" AND ; VARTYPE(tnDia) = "N" AND ; BETWEEN(tnAnio, 100, 9999) AND ; BETWEEN(tnMes, 1, 12) AND ; BETWEEN(tnDia, 1, 31) AND ; NOT EMPTY(DATE(tnAnio, tnMes, tnDia)) ENDFUNC Saber si un ao es bisiesto: Retorna verdadero si el ao pasado como parmetro es bisiesto. ? EsBisiesto(2004) FUNCTION EsBisiesto(tnAnio) RETURN NOT EMPTY(DATE(tnAnio,2,29)) ENDFUNC Calcular una fecha festiva: Retorna una fecha festiva como por ejemplo el "Da de la Madre" que en algunos pases se celebra el "Tercer Domingo de Octubre". Los parmetros que recibe la esta funcin son los siguientes: tnOrdinal: El ordinal que se desea saber (1, 2, 3, ...) tnDiaSem: El da de la semana (1=Dom, 2=Lun, ..., 7=Sb) tnMes: El nmero del mes (1=Ene, 2=Feb, ..., 12=Dic) tnAnio: El ao *-- Tercer Domingo de Octubre de 2004 ? FechaFestiva(3,7,10,2004) FUNCTION FechaFestiva(tnOrdinal,tnDiaSem,tnMes,tn RETURN DATE(tnAnio,tnMes,1) + tnOrdinal * 7 - ; DOW(DATE(tnAnio,tnMes,1) + tnOrdinal * 7 -1,tnDiaSem) ENDFUNC Fecha en espaol: Retorna una cadena con la fecha en espaol en formato "Sbado 01 de Enero de 2005" ? cFecha(DATE(2005,1,1)) FUNCTION cFecha(tdFecha) LOCAL aDias(7), aMeses(12) aDias[1]="Domingo "

aDias[2]="Lunes " aDias[3]="Martes " aDias[4]="Mircoles " aDias[5]="Jueves " aDias[6]="Viernes " aDias[7]="Sbado " aMeses[1]="Enero" aMeses[2]="Febrero" aMeses[3]="Marzo" aMeses[4]="Abril" aMeses[5]="Mayo" aMeses[6]="Junio" aMeses[7]="Julio" aMeses[8]="Agosto" aMeses[9]="Setiembre" aMeses[10]="Octubre" aMeses[11]="Noviembre" aMeses[12]="Diciembre" RETURN aDias(DOW(tdFecha,1)) + ; TRANSFORM(DAY(tdFecha),"@L 99") + ; " de " + aMeses(MONTH(tdFecha)) + ; " de " + TRANSFORM(YEAR(tdFecha),"@L 9999") ENDFUNC Configuraciones Se debe recordar que muchas de las funciones de fecha y hora estn afectadas por las configuraciones de Windows y Visual FoxPro.Se recomienda la lectura en la ayuda de la sintaxis y alcance de los siguientes comandos: SET DATE, SET CENTURY, SET HOURS, SET SECONDS, SET SYSFORMAT, SET FDOW, SET FWEEK, SET STRICTDATE y SET MARK. Final Estas son la mayora de las funciones de Visual FoxPro referidas a expresiones de fechas y horas. En PortalFox se pueden encontrar mas funciones definidas por el usuario referidas a fechas y horas.