Translate

quarta-feira, 26 de março de 2014

PostgreSql - Somar dias úteis a uma data

Vamos mostrar neste artigo, como utilizar a função "adiciona_dias_uteis" que adiciona dias úteis a uma data. Vamos apresentar três exemplos no final do artigo.

Não são considerados dias úteis:
  • Sábado ou domingo;
  • Feriados federais: feriados do país (nacional);
  • Feriados estaduais: feriados do estado;
  • Feriados municipais: feriados do munícipio (cidade);
  • Feriados móveis: feriados que não tem data fixa. Páscoa, Carnaval,  Sexta-feira da paixão e Corpus Christi;

Caso tenha interesse, faça o download do código dos exemplos comentados, ou veja no GitHub.
Após baixar os exemplos execute os scripts:
  • cria_tab_feriados_est_cid.sql: para criar as tabelas tab_feriado_federal, tab_feriado_estadual, tab_feriado_municipal, tab_cidades, tab_estados que são necessárias para executar o exemplo;
  • feriados_moveis.sql: cria a função feriados_moveis que calcula feriados sem data fixa. A função "feriados_moveis" é utilizada pela função "adiciona_dias_uteis";
  • adiciona_dias_uteis.sql: cria a função que adicionará dias úteis a uma data;
  • exemplo_1.sql, exemplo_2.sql e exemplo_3.sql: scripts dos exemplos 1, 2 e 3 respectivamente. Os scripts dos tópicos anteriores, devem ser executados antes dos scripts dos exemplos.

Para acrescentar dias úteis vamos utilizar:
  • tabela tab_feriado_federal: armazena os feriados federais no formato ano-mês-dia (yyyy-mm-dd). Pode parecer estranho a data estar com o ano de 1900, mas poderia ser qualquer outro ano, por exemplo, 2014. Quando verificamos se a data é feriado utilizamos apenas o mês e o dia, mas como o campo é do tipo date é obrigatório passar o dia, mês e ano. Veja a imagem a seguir.
  • tab_feriado_federal
    Descrição das colunas:
    • descricao: nome do feriado federal;
    • feriado_federal: data do feriado federal;
  • tabela tab_feriado_estadual: armazena os feriados estaduais. Os feriados estaduais também estão no formato (yyyy-mm-dd) e o ano também foi escolhido de forma aleatória, pois na verificação só é utilizado o mês e o dia. Veja a imagem a seguir.
  • tab_feriado_estadual
    Descrição das colunas:
    • sigla_estado: sigla do estado;
    • descricao: nome do feriado estadual;
    • feriado_estadual: data do feriado estadual;
  • tabela tab_feriado_municipal: armazena os feriados municipais. Os feriados municipais também estão no formato (yyyy-mm-dd) e o ano também foi escolhido de forma aleatória, pois na verificação só é utilizado o mês e o dia. Devido a quantidade de feriados municipais ser muito grande, preenchemos os feriados para as cidades de São Paulo e Porto Alegre, para servir como exemplo. Caso seja necessário, preencha a tabela com os feriados de outras cidades. Veja a imagem a seguir.
  • tab_feriado_municipal
    Descrição das colunas:
    • cidade_id: identificação da cidade;
    • descricao: nome do feriado;
    • feriado_municipal: data do feriado municipal;
  • tabela tab_cidades: armazena as cidades brasileiras. Cadastrei somente as cidades de São Paulo e Porto Alegre, para poder demonstrar o exemplo. Caso seja necessário, preencha a tabela com outras cidades.
  • tab_cidades
    Descrição das colunas:
    • cidade_id: identificação da cidade;
    • cidade_nome: nome da cidade;
    • sigla_estado: sigla do estado;
  • tabela tab_estados: armazena os estados brasileiros.
  • tab_estados
    Descrição das colunas:
    • sigla_estado: sigla do estado;
    • descrição: nome do estado;
  • função adiciona_dias_uteis: função executada pelo usuário, para utilizá-la devemos passar os argumentos a seguir:
  • SELECT adiciona_dias_uteis('data', quantidade_de_dias_uteis, codigo_da_cidade);
    Onde:
    • data: data inicial, ou seja a data a qual vai ser adicionado dias úteis;
    • quantidade_de_dias_uteis: indica quantos dias úteis é preciso somar a data;
    • codigo_da_cidade: código da cidade a qual estamos calculando os dias úteis. Os códigos das cidades utilizados na função devem estar armazenados na tabela "tab_cidades". Cadastrei somente as cidades de "São Paulo" e  "Porto Alegre" para demonstrar o exemplo. Cadastre novas cidades, conforme a sua necessidade. Caso as novas cidades tenham feriados municipais cadastre-os na tabela "tab_feriado_municipal";
  • função feriados_moveis: calcula os feriados móveis. Esta função não é executada pelo usuário. Ela é utilizada apenas pela função "adiciona_dias_uteis".


1º Exemplo

Adicionar 6 dias úteis a data 04/07/2014 para a cidade de São Paulo.


Solução

Vamos executar a função "adiciona_dias_úteis":

SELECT adiciona_dias_uteis('data'quantidade_de_dias_uteiscodigo_da_cidade);
Onde:
  • data: data inicial, ou seja a data a qual vai ser adicionado dias úteis;
  • quantidade_de_dias_uteis: indica quantos dias úteis é preciso somar a data;
  • codigo_da_cidade: codigo da cidade a qual estamos calculando os dias úteis; 

SELECT adiciona_dias_uteis('2014-07-04'61);


Após a execução da função, teremos o resultado a seguir.
2º Exemplo

Adicionar 6 dias úteis a data 04/07/2014 para a cidade de Porto Alegre.



Solução

Vamos executar a função "adiciona_dias_úteis":

SELECT adiciona_dias_uteis('data'quantidade_de_dias_uteiscodigo_da_cidade);
Onde:
  • data: data inicial, ou seja a data a qual vai ser adicionado dias úteis;
  • quantidade_de_dias_uteis: indica quantos dias úteis é preciso somar a data;
  • codigo_da_cidade: codigo da cidade a qual estamos calculando os dias úteis; 

SELECT adiciona_dias_uteis('2014-07-04'62);


Após a execução da função, teremos o resultado a seguir.
3º Exemplo

Os pacientes recebem os resultados dos exames 7 dias úteis após a data do exame. Devemos exibir as datas de entrega dos resultados dos exames. Para calcularmos as datas de entrega vamos utilizar as tabelas "tab_exame_paciente" e "tab_laboratorio". Veja as tabelas nas imagens a seguir:

tab_exame_paciente


Descrição das colunas da tabela tab_exame_paciente
  • exame_codigo: código do exame;
  • exame_data:  data do exame;
  • laboratorio_codigo: código do laboratório;
  • paciente_codigo: código do paciente;

tab_laboratorio

Descrição das colunas da tabela tab_laboratorio
  • laboratorio_codigo: código do laboratório;
  • laboratorio_endereco: endereço do laboratório;
  • cidade_id: identificação da cidade;
Solução

Vamos executar a função "adiciona_dias_úteis":

SELECT adiciona_dias_uteis('data'quantidade_de_dias_uteiscodigo_da_cidade);
Onde:
  • data: data inicial, ou seja a data a qual vai ser adicionado dias úteis. Vamos utilizar a coluna "exame_data" da tabela "tab_exame_paciente";
  • quantidade_de_dias_uteis: indica quantos dias úteis é preciso somar a data;
  • codigo_da_cidade: código da cidade a qual estamos calculando os dias úteis. Vamos utilizar a coluna "cidade_id" da tabela "tab_laboratorio";
Perceba que os parâmetros que serão utilizados na função são colunas que estão em tabelas diferentes, por isso vamos precisar utilizar o comando sql "JOIN".

SELECT
exame_codigo,
tab_exame_paciente.laboratorio_codigo,
paciente_codigo,
exame_data,
adiciona_dias_uteis(exame_data, 5, cidade_id) AS exame_entrega
FROM tab_exame_paciente
JOIN tab_laboratorio
ON tab_exame_paciente.laboratorio_codigo = tab_laboratorio.laboratorio_codigo;

Após a execução da função, teremos o resultado a seguir.


Comente no campo abaixo. Suas sugestões ou críticas serão bem-vindas.

Um comentário: