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.
- 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.
- 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.
- 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.
- 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.
- cidade_id: identificação da cidade;
- cidade_nome: nome da cidade;
- sigla_estado: sigla do estado;
- tabela tab_estados: armazena os estados brasileiros.
- 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:
- 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".
tab_feriado_federal |
Descrição das colunas:
tab_feriado_estadual |
Descrição das colunas:
tab_feriado_municipal |
Descrição das colunas:
tab_cidades |
Descrição das colunas:
tab_estados |
Descrição das colunas:
SELECT adiciona_dias_uteis('data', quantidade_de_dias_uteis, codigo_da_cidade);
Onde:
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_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: codigo da cidade a qual estamos calculando os dias úteis;
SELECT adiciona_dias_uteis('2014-07-04', 6, 1);
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_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: codigo da cidade a qual estamos calculando os dias úteis;
SELECT adiciona_dias_uteis('2014-07-04', 6, 2);
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;
Vamos executar a função "adiciona_dias_úteis":
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. 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";
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.
Este comentário foi removido por um administrador do blog.
ResponderExcluir