Bom dia, pessoal.

Fiz algumas views para períodos semanais, quinzenais e mensais, conforme 
scripts abaixo.
Penso que, para melhorar, uma função fn_periodo(int2), onde: 0 = semana, 1 = 
quinzena ou 2 = mês, para unificar a seleção, seria muito bom.

Alguma sugestão dos colegas? 



Seguem views.

    
--Períodos semanais  
-- Considerando períodos semanais de sábado até sexta (Sabado, Domingo... 
Sexta).

CREATE OR REPLACE VIEW view_prd_semanal AS 
    SELECT 
        DISTINCT 
        data::date AS data_inicio, 
        data::date + 6 AS data_fim,
        to_char(data, 'YYYYMM')::character(6) AS periodo
    FROM view_dinamica_hsaequ
    WHERE 
        to_char(data, 'D')::character(1) = '7'::bpchar
    ORDER BY 
        data DESC;

***************************************************************
--Períodos quinzenais
CREATE OR REPLACE VIEW view_prd_quinzenal AS
SELECT 
    --Primeira quinzena do mês
    CASE WHEN FLOOR(LOG(DATE_PART('day', data))/LOG(15)) = 0 THEN 
        DATE_TRUNC('month',data)

    --Segunda quinzena do mês
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '15 day'
    END::DATE AS data_inicio,


    --Ultimo dia do mes (segunda quinzena)
    CASE WHEN  FLOOR(LOG(date_part('day', data))/LOG(15)) = 1 then 
        DATE_TRUNC('month',data) + INTERVAL'1 month' - INTERVAL '1 day'
    --Primeiro dia da segunda quinzena do mês (dia 16)
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '14 day'
    END::DATE AS data_fim,
    -- quando for = 0, primeira quinzena; quando for = 1, segunda quinzena 
    FLOOR(LOG(DATE_PART('day', data))/LOG(15)) AS quinzena


FROM view_dinamica_hsaequ 

GROUP BY

    --Primeira quinzena do mês
    CASE WHEN FLOOR(LOG(DATE_PART('day', data))/LOG(15)) = 0 THEN 
        DATE_TRUNC('month',data)

    --Segunda quinzena do mês
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '15 day'
    END::DATE,


    --Ultimo dia do mes (segunda quinzena)
    CASE WHEN  FLOOR(LOG(date_part('day', data))/LOG(15)) = 1 then 
        DATE_TRUNC('month',data) + INTERVAL'1 month' - INTERVAL '1 day'
    --Primeiro dia da segunda quinzena do mês (dia 16)
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '14 day'
    END::DATE,
    -- quando for = 0, primeira quinzena; quando for = 1, segunda quinzena 
    FLOOR(LOG(DATE_PART('day', data))/LOG(15))
ORDER BY 
    --Primeira quinzena do mês
    CASE WHEN FLOOR(LOG(DATE_PART('day', data))/LOG(15)) = 0 THEN 
        DATE_TRUNC('month',data)

    --Segunda quinzena do mês
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '15 day'
    END::DATE DESC,


    --Ultimo dia do mes (segunda quinzena)
    CASE WHEN  FLOOR(LOG(date_part('day', data))/LOG(15)) = 1 then 
        DATE_TRUNC('month',data) + INTERVAL'1 month' - INTERVAL '1 day'
    --Primeiro dia da segunda quinzena do mês (dia 16)
    ELSE
        DATE_TRUNC('month',data) + INTERVAL '14 day'
    END::DATE,
    -- quando for = 0, primeira quinzena; quando for = 1, segunda quinzena 
    FLOOR(LOG(DATE_PART('day', data))/LOG(15));
********************************************************************

CREATE OR REPLACE VIEW view_prd_mensal AS
SELECT 
    DISTINCT 
    CAST(DATE_TRUNC('month',data) AS date) AS data_inicio,
    CAST(DATE_TRUNC('month',data) + INTERVAL'1 month' - INTERVAL '1 day' AS 
date) AS data_fim,
    TO_CHAR(data, 'YYYYMM')::character(6) AS periodo

FROM view_dinamica_hsaequ 

ORDER BY 
    CAST(DATE_TRUNC('month',data) AS date) DESC;

************************************************************************
Att Carlos Antônio Pereira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a