Funções de Data

Discussão em 'Comandos Básicos' iniciado por fdantas, Fevereiro 8, 2009.

  1. fdantas

    fdantas Administrator Moderador

    Descobrindo o ano de uma data
    DISP YEAR(TODAY).

    Descobrindo o mes de uma data
    DISP MONTH(TODAY).

    Descobrindo o dia de uma data
    DISP DAY(TODAY).
  2. Reinaldo

    Reinaldo Sem Pontuação

    /* --------------------------------------------------------------------------
    File : Include que incrementa no programa aS funcoes:
    UltDiaUtil
    PrimDiaUtil
    Author(s) : Reinaldo
    Data : 18/07/2001
    ------------------------------------------------------------------------ */
    /**************************************************************************/
    FUNCTION UltDia RETURNS DATE
    ( vpfdta as date ) :
    /*------------------------------------------------------------------------------
    Purpose: Recebe uma data retorna ultima data do mes.
    exemplo: v-data = UltDia( v-dtaref )
    ------------------------------------------------------------------------------*/
    def var vf-dta as date no-undo.
    def var vf-mes as integer no-undo.
    def var vf-ano as integer no-undo.

    /* ultimo dia do mes */
    assign vf-mes = if month(vpfdta) = 12 then 1 else month(vpfdta) + 1
    vf-ano = if month(vpfdta) = 12 then year(vpfdta) + 1 else year(vpfdta)
    vf-dta = date( vf-mes , 01 , vf-ano ) - 1.

    RETURN vf-dta. /* Function return value. */

    END FUNCTION.
    /**************************************************************************/
    FUNCTION UltDiaUtil RETURNS DATE
    ( vpfdta as date , vpf-numagencia as integer , vpf-feriadoNacional as logical) :
    /*------------------------------------------------------------------------------
    Purpose: Recebe uma data e calcula a ultima data util do mes.
    exemplo: v-data = UltDiaUtil( v-dtaref , 27, yes ) -> ultimo dia util do
    mes, local 27, feriado
    nacional
    ------------------------------------------------------------------------------*/
    def var vf-dta as date no-undo.

    run prg/p-feri03.p(input UltDia(vpfdta) , input vpf-numagencia,
    input vpf-feriadoNacional, input "-", output vf-dta ).

    RETURN vf-dta. /* Function return value. */

    END FUNCTION.

    /**************************************************************************/
    FUNCTION PrimDia RETURNS DATE
    ( vpfdta as date ) :
    /*------------------------------------------------------------------------------
    Purpose: Recebe uma data e calcula a ultima data util do mes.
    exemplo: v-data = PrimDia( v-dtaref )
    ------------------------------------------------------------------------------*/
    def var vf-dta as date no-undo.

    assign vf-dta = date( month(vpfdta) , 01 , year(vpfdta)).

    RETURN vf-dta. /* Function return value. */

    END FUNCTION.

    /**************************************************************************/
    FUNCTION PrimDiaUtil RETURNS DATE
    ( vpfdta as date , vpf-numagencia as integer , vpf-feriadoNacional as logical) :
    /*------------------------------------------------------------------------------
    Purpose: Recebe uma data e calcula a ultima data util do mes.
    exemplo: v-data = PrimDiaUtil( v-dtaref , 27, yes ) -> primeiro dia util do
    mes, local 27, feriado
    nacional
    ------------------------------------------------------------------------------*/
    def var vf-dta as date no-undo.

    run prg/p-feri03.p(input PrimDia(vpfdta) , input vpf-numagencia,
    input vpf-feriadoNacional, input "+", output vf-dta ).

    RETURN vf-dta. /* Function return value. */

    END FUNCTION.

    /**************************************************************************/
    /**************************************************************************/
  3. rbaselio

    rbaselio Membro Participativo

    Tomei a liberdade de publicar as funções com datas que eu criei, estão não dependem de programas compilados da datasul e incluem um algoritmo para calculo do Dia da Pascoa, data base para o calculo dos outros feriados moveis.

    Código:
    /*
    File : Include que incrementa no programa as funcoes com dadas:
    ultimo-dia
    primeiro-dia
    inc-meses
    pascoa
    corpus-crist
    sexta-santa
    dia-util 
    pri-dia-util 
    ult-dia-util 
    Author: Roberto Baselio Lopes
    Data : 03/01/2011
    */
    /****************FUNÇÕES COM DATAS**********************/
    /*função para encontrar o ultimo dia do mês*/
    FUNCTION ultimo-dia RETURNS DATE (INPUT dt AS DATE ): 
        IF dt = ? THEN RETURN (?). 
        RETURN (DATE(MONTH(dt),28,YEAR(dt)) + 4 - DAY(DATE(MONTH(dt),28,YEAR(dt)) + 4) ). 
    END FUNCTION.
    
    FUNCTION primeiro-dia RETURNS DATE (INPUT dt AS DATE): 
         IF dt = ? THEN RETURN  ( ? ). 
         RETURN (DATE(month(dt),01,YEAR(dt))). 
    END FUNCTION. 
    
    
    /*função para somar meses em uma data*/
    /*se inteiro passado for negativo ele subtrai*/
    FUNCTION inc-meses RETURNS DATE (INPUT data AS DATE, INPUT meses AS INT):
        IF meses = 0 THEN RETURN data.
        DEFINE VARIABLE aux AS INTEGER     NO-UNDO.
        DEFINE VARIABLE aux-data AS DATE        NO-UNDO.
        aux = (YEAR(data) * 12) + MONTH(data) + meses .
        aux-data = date((int(aux MOD 12)), day(data), int(TRUNCATE( aux / 12 , 0))) NO-ERROR.
        IF aux-data = ? THEN RETURN ultimo-dia(date((int(aux MOD 12)), 1, int(TRUNCATE( aux / 12 , 0)))).
        RETURN aux-data.
    END FUNCTION.
    
    /*calcula a pascoa de um determinado ano*/
    FUNCTION pascoa RETURNS DATE (INPUT data AS DATE):
        DEFINE VARIABLE a AS INTEGER     NO-UNDO.
        DEFINE VARIABLE b AS INTEGER     NO-UNDO.
        DEFINE VARIABLE c AS INTEGER     NO-UNDO.
        DEFINE VARIABLE d AS INTEGER     NO-UNDO.
        DEFINE VARIABLE e AS INTEGER     NO-UNDO.
        DEFINE VARIABLE f AS INTEGER     NO-UNDO.
        DEFINE VARIABLE g AS INTEGER     NO-UNDO.
        DEFINE VARIABLE h AS INTEGER     NO-UNDO.
        DEFINE VARIABLE i AS INTEGER     NO-UNDO.
        DEFINE VARIABLE k AS INTEGER     NO-UNDO.
        DEFINE VARIABLE L AS INTEGER     NO-UNDO.
        DEFINE VARIABLE m AS INTEGER     NO-UNDO.
        DEFINE VARIABLE ano AS INTEGER     NO-UNDO.
        DEFINE VARIABLE mes AS INTEGER     NO-UNDO.
        DEFINE VARIABLE dia AS INTEGER     NO-UNDO.
    
        ASSIGN
            ano = year(data)
            a = ano mod 19
            b = truncate(ano / 100, 0)
            c = ano mod 100
            d = truncate(b / 4, 0)
            e = b mod 4
            f = TRUNCATE((b + 8 ) / 25, 0)
            g = TRUNCATE((b - f + 1) / 3, 0)
            h = (19 * a + b - d - g + 15) MOD 30
            i = truncate(c / 4, 0)
            k = c mod 4
            L = (32 + 2 * e + 2 * i - h - k) MOD 7
            m = truncate((a + 11 * h + 22 * L) / 451, 0)
            mes = (TRUNCATE((h + l - 7 * m + 114) / 31, 0))
            dia = (( h + l - 7 * m + 114) MOD 31) + 1.
        RETURN DATE(mes, dia, ano).
    END FUNCTION.
    
    /*calcula o feriado de corpus-crist*/
    FUNCTION corpus-crist RETURNS DATE (INPUT data AS DATE):
        RETURN pascoa(data) + 60.
    END FUNCTION.
    
    /*calcula o feriado de sexta-feira santa*/
    FUNCTION sexta-santa RETURNS DATE (INPUT data AS DATE):
        RETURN pascoa(data) - 2.
    END FUNCTION.
    
    /*verifica se o dia é util ou não*/
    /*esta função considera feriados estaduais (São Paulo) e municipais */
    FUNCTION dia-util RETURNS logical (INPUT data AS DATE):
        DEFINE VARIABLE dia AS integer EXTENT 10 NO-UNDO INITIAL [1, 21, 1, 9, 26, 7,  2, 15, 20, 25]. 
        DEFINE VARIABLE mes AS INTEGER EXTENT 10 NO-UNDO INITIAL [1,  4, 5, 7,  7, 9, 11, 11, 11, 12].
        DEFINE VARIABLE i AS INTEGER  INIT 1   NO-UNDO.
    
        IF WEEKDAY(data) = 1 OR WEEKDAY(data) = 7 THEN RETURN FALSE.
        ELSE IF data = corpus-crist(data) OR
                data = sexta-santa(data) THEN RETURN false.
        ELSE DO WHILE i < 11: 
            IF DAY(data) = dia[i] AND MONTH(data) = mes[i] THEN RETURN false.
            i = i + 1.
        END.
        RETURN true.
    END FUNCTION.
    
    /*retorna o primeiro dia util*/
    FUNCTION pri-dia-util RETURNS DATE (INPUT data AS DATE):
        data = primeiro-dia(data).
        DO WHILE dia-util(data) = FALSE:
            data = data + 1.
        END.
        RETURN data.
    END FUNCTION.
    
    /*retorna o ultimo dia util*/
    FUNCTION ult-dia-util RETURNS DATE (INPUT data AS DATE):
        data = ultimo-dia(data).
        DO WHILE dia-util(data) = FALSE:
            data = data - 1.
        END.
        RETURN data.
    END FUNCTION.
    
    
    Roberto Baselio Lopes

Compartilhe esta Página