Hola invitado         02 Sep, 2010 - 04:45
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Trabajar con fechas y horas en Visual FoxPro lecturas 37353
 Enviado por Luis María Guayán en Martes, 14 Septiembre, 2004
Artículos Artículo que describe las funciones nativas de Visual FoxPro y diversas funciones definidas por el usuario para el tratamiento de expresiones de tipo Date y DateTime.

Trabajar con fechas y horas en Visual FoxPro

Luis María Guayán Por Luis María Guayán, Tucumán, Argentina


Introducción

Visual FoxPro posee muchas funciones nativas que generan y manipulan expresiones de tipo Date y DateTime. En este artículo veremos las características de algunas de estas funciones y una recopilación de funciones definidas por el usuario publicadas en PortalFox que nos permitirán obtener diversos resultados a partir de este tipo de expresiones.

Funciones DATE() y DATETIME()

La función 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 función 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 número de días transcurridos entre ambas fechas.

? DATE(2004,12,31) - DATE(2004,1,1) 

Si se suman o restan cantidades numéricas de días a una expresión de tipo Date, el resultado es otra expresión de tipo Date.

? DATE() + 7   && La fecha actual mas 7 días
? DATE() - 15  && La fecha actual menos 15 días 

La función DATETIME() nos retorna la fecha y hora actual del sistema si se ejecuta sin argumentos. Al igual que la función DATE() y para evitar complicaciones con fechas ambiguas es conveniente que siempre utilicemos la función DATETIME(nAnio,nMes,nDia,nHoras,nMinutos,nSegundo) 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 número 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 expresión de tipo DateTime, el resultado es una expresión 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 "vacías" lo hacemos de la siguiente manera:

dFecha = {}      && Expresion Date vacia
dFecha = {//}    && Expresion Date vacia
tFHora = {/:}    && Expresión DateTime vacia
tFHora = {//::}  && Expresión DateTime vacia 

En estos últimos ejemplos, se debe tener en cuenta que la mayoría de los servidores de bases de datos no trabaja con el concepto de fechas "vacías" como lo hace Visual FoxPro. En estos casos se debe utilizar fechas nulas debido a que se tendrán 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 función DTOT() (al igual que si omitimos los argumentos de horas en la función 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 año, el mes, el día, la semana, etc.

dFecha = DATE(2004,06,03)
tFHora = DATETIME(2004,05,18,11,30,45)
? YEAR(dFecha)     && Año de una expresión Date o DateTime
? MONTH(tFHora)    && Mes de una expresión Date o DateTime
? DAY(dFecha)      && Día de una expresión Date o DateTime
? HOUR(tFHora)     && Horas de una expresión DateTime
? MINUTE(tFHora)   && Minutos de una expresión DateTime
? SEC(tFHora)      && Segundos de una expresión DateTime
? DOW(dFecha)      && Número del día de la semana de una expresión Date o DateTime
? WEEK(dFecha)     && Número de semana del año de una expresión Date o DateTime
? QUARTER(tFHora)  && Trimestre del año de una expresión Date o DateTime 

Todas las funciones anteriores retornan valores numéricos.

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 expresión Date o DateTime
? CDOW(tFHora)    && Nombre del día de la semana de una expresión Date o DateTime
? DMY(tFHora)     && Cadena con el formato día-mes-año de una expresión Date o DateTime
? MDY(tFHora)     && Cadena con el formato mes-día-año de una expresión Date o DateTime
? TTOC(tFHora)    && Convierte una expresión DateTime a caracter 
? DTOC(dFecha)    && Convierte una expresión Date a caracter 

Para retornar una cadena de caracteres solo con la hora de una variable DateTime se utiliza la función TTOC() con el segundo parámetro igual a 2.

? TTOC(DATETIME(),2) 

En Visual FoxPro se puede retornar una fecha con "n" meses anteriores o posteriores de una expresión Date o DateTime con la función GOMONTH().

? GOMONTH(DATE(),3)        && Tres meses después 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 lógicos, 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° expresión está dentro de los valores 2° y 3°
? BETWEEN(DATE(),dFecha1,Dfecha2)
*-- Retorna .T. si la expresión 1° coincide con alguna de la lista
? INLIST(DATE(2004,1,1),dFecha0,dFecha1,dFecha2,dFecha3)
*-- Retorna la expresión Date o DateTime con valor mínimo
? MIN(dFecha1,dFecha2)
*-- Retorna la expresión Date o DateTime con valor máximo
? 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 aritméticas con estos valores.

? TIME()  && Hora actual del sistema 

SECONDS() retorna el número 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 número de día Juliano de la fecha actual del sistema.

SYS(10,nDiaJuliano) retorna una cadena de caracteres con la fecha correspondiente al día Juliano pasado como parámetro.

SYS(11,dFecha) retorna una cadena de caracteres con el número de día Juliano de la fecha pasada como parámetro.

? SYS(1)
? SYS(10,VAL(SYS(1)))
? SYS(11,DATE(2005,1,1))

Los valores válidos en Visual FoxPro para los días días del calendario Juliano están comprendidos entre el 14 de Setiembre de 1752 y el 31 de Diciembre de 9999.

Funciones definidas por el usuario

A continuación describiremos diversas funciones definidas por el usuario (UDF) que utilizan las funciones nativas de Visual FoxPro descriptas al comienzo de este artículo, que nos permiten trabajar con expresiones Date y DateTime. Esta funciones están publicadas en PortalFox y algunas fueron ligeramente modificadaspara este este artículo.

Último día del mes: Esta función retorna la fecha del último día del mes de una expresión Date o DateTime pasada como parámetro.

? EoM(DATE())
FUNCTION EoM(tdFecha)
  LOCAL ld 
  ld = GOMONTH(tdFecha,1)
  RETURN ld - DAY(ld)
ENDFUNC 

Primer día del mes: Esta función retorna la fecha del primer día del mes de una expresión Date o DateTime pasada como parámetro.

? BoM(DATE())
FUNCTION BoM(tdFecha)
  RETURN DATE(YEAR(tdFecha),MONTH(tdFecha),1)
ENDFUNC 

Cantidad de días de un mes: Esta función retorna la cantidad de días que tiene el mes de una expresión Date o DateTime pasada como parámetro.

? 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 parámetros la fecha de nacimiento y la fecha a la cual calculamos la edad. Si no se pasa el segundo parámetro 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 años, meses y días: Calcula la cantidad de años, meses y días entre dos expresiones de tipo Date pasadas como parámetros. (esta función 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 año 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))+ " años, " + ;
    ALLTRIM(STR(lnMes))+ " meses y " + ;
    ALLTRIM(STR(lnDia))+ " días"
  RETURN lcRet
ENDFUNC 

Diferencias entre dos variables DateTime: Calcula la cantidad de días, horas, minutos y segundos entre dos expresiones DateTime pasadas como parámetros.

? Diferencia_DHMS(DATETIME(2000,3,1,12,10,05),DATETIME())
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))+ " días, "+ ;
    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 parámetro al formato hora "HH:MM:SS". Con esta función 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 (año,mes,día) pasada como parámetro es válida.

? 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 año es bisiesto: Retorna verdadero si el año pasado como parámetro 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 "Día de la Madre" que en algunos países se celebra el "Tercer Domingo de Octubre". Los parámetros que recibe la esta función son los siguientes:

tnOrdinal: El ordinal que se desea saber (1°, 2°, 3°, ...) tnDiaSem: El día de la semana (1=Dom, 2=Lun, ..., 7=Sáb) tnMes: El número del mes (1=Ene, 2=Feb, ..., 12=Dic) tnAnio: El año

*-- Tercer Domingo de Octubre de 2004
? FechaFestiva(3,7,10,2004)
FUNCTION FechaFestiva(tnOrdinal,tnDiaSem,tnMes,tnAnio)
  RETURN DATE(tnAnio,tnMes,1) + tnOrdinal * 7 - ;
    DOW(DATE(tnAnio,tnMes,1) + tnOrdinal * 7 -1,tnDiaSem)
ENDFUNC 

Fecha en español: Retorna una cadena con la fecha en español en formato "Sábado 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]="Miércoles "
  aDias[5]="Jueves "
  aDias[6]="Viernes "
  aDias[7]="Sábado "
  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 están 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 mayoría 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.

Hasta la próxima.

Luis María


 Versión imprimible  
Trabajar con fechas y horas en Visual FoxPro | Entrar/Crear una cuenta | 6 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.

Re: Trabajar con fechas y horas en Visual FoxPro


por eMans en 14 Sep, 2004 - 07:51
(Información del usuario  | Enviar un mensaje 
Magnifico !!!

Saludos, eMans

Re: Trabajar con fechas y horas en Visual FoxPro


por CTrinidadH en 23 Nov, 2004 - 10:10
(Información del usuario  | Enviar un mensaje http://)
Hola Luis,

Realmente bueno el articulo sobre las fechas, me saco de algunas broncas...

Esta clase de código y de explcaciones es lo que realmente nos hace falta...

Gracias...

Carlos Trinidad

Re: Trabajar con fechas y horas en Visual FoxPro


por r_suarezr en 08 Sep, 2005 - 08:45
(Información del usuario  | Enviar un mensaje http://)
Luis Maria.

Realmente muy bueno tu articulo. Me saco de algunos lios. Gracias

Re: Trabajar con fechas y horas en Visual FoxPro


por GAVILAN (programa1hotmail@com) en 31 Ago, 2008 - 07:25
(Información del usuario  | Enviar un mensaje 
Hola Luis!

Cada vez que no recuerdo como hacer algo con fechas regreso a tu artículo, está muy simple y elegante, se ve que andabas fumado!.

Saludos!

Del Gavilán

Trabajar con fechas y horas en Visual FoxPro


por EdisonMoreno en 29 Ago, 2009 - 09:52
(Información del usuario  | Enviar un mensaje 
Hasta muy interesante y completo.

Adicionó una forma de extaer solo la hora.

TTOC(DATETIME(),2)

Re: Trabajar con fechas y horas en Visual FoxPro


por mcf_cba (mail@mcf.com.ar) en 21 Ene, 2010 - 04:27
(Información del usuario  | Enviar un mensaje http://)
Como siempre Luis María, tus artículos son de lo mejor.

Muchas gracias por el tiempo que le dedicás a ello!!

Saludos!


Cecilia Fernández.
Villa María. Córdoba. Argentina.




Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.