Tecnologia da Informação
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º ExemploAdicionar 6 dias úteis a data 04/07/2014 para a cidade de São Paulo.
SoluçãoVamos 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º ExemploAdicionar 6 dias úteis a data 04/07/2014 para a cidade de Porto Alegre.
SoluçãoVamos 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;
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. 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.
loading...
-
Subtrair Intervalo De Uma Data
Vamos mostrar neste artigo, como subtrair um período de uma data. Descrevemos 3 exemplos: 1º exemplo: mostra como subtrair um período de dias de uma data. São descritas duas soluções para resolver este problema. A primeira utiliza a subtração...
-
Mysql - Diferença Entre Datas
Neste post vamos apresentar 4 exemplos de como calcular a diferença entre datas. Para calcular a diferença entre duas datas, em dias, utilizamos a função "DATEDIFF". Esta função é utilizada no 1º e 2º exemplos. DATEDIFF (data_final, data_inicial)...
-
Postgresql - Diferença Entre Datas
Neste post vamos apresentar 4 exemplos de como calcular a diferença entre datas. Caso tenha interesse, faça o download ou veja o script no Github. Para calcular a diferença entre duas datas, em dias, no postgresql utilizamos o operador aritmético...
-
Postgresql - Extrair Parte De Uma Data Com Extract
A função extract extrai parte de uma data ou intervalo. Ela é equivalente a função date_part. Vamos descrever 3 exemplos com a função extract. Caso tenha interesse faça download dos exemplos ou veja no GitHub. 1º Exemplo: vamos extrair partes...
-
Postgresql - Exemplo Date_part
A função date_part extrai parte de uma data ou intervalo. Vamos descrever 2 exemplos com esta função. 1º Exemplo: vamos extrair partes da data da coluna "data_exame" da tabela "tb_exame". A tabela contém informações da realização de exames...
Tecnologia da Informação