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