[SQL ORACLE ] QUERY COM INTERVADO DE DATA, RETIRANDO OS FERIADOS
SQL
Pessoal preciso montar uma query, onde eu pegue os 5 ultimos dias uteis, retirando os feriados(Já tenho essa tabela), onde eu some todas as linhas e tire a média dela.
Exemplo
eu tenho pedidos de segunda a sexta
porém quarta é feriado eu não quero contar com esse dia
então eu vou pegar sexta, segunda, terça, quinta e sexta, somo a quantidade e divido por 5 para pegar a média
como faço isso pelo Oracle SQL
minha tabela de feriado esta assim
id dia mes feriado
1 1 1 Ano Novo
2 25 1 Aniversário da Cidade
3 21 4 Dia de Tiradentes
4 1 5 Dia do Trabalho
5 9 7 Revolução Constitucionalista
6 7 9 Independência do Brasil
7 12 10 Nossa Senhora Aparecida
8 2 11 Dia de Finados
9 15 11 Proclamação da República
10 20 11 Dia da Consciência Negra
11 25 12 Natal
Pessoal preciso montar uma query, onde eu pegue os 5 ultimos dias uteis, retirando os feriados(Já tenho essa tabela), onde eu some todas as linhas e tire a média dela.
Exemplo
eu tenho pedidos de segunda a sexta
porém quarta é feriado eu não quero contar com esse dia
então eu vou pegar sexta, segunda, terça, quinta e sexta, somo a quantidade e divido por 5 para pegar a média
como faço isso pelo Oracle SQL
minha tabela de feriado esta assim
id dia mes feriado
1 1 1 Ano Novo
2 25 1 Aniversário da Cidade
3 21 4 Dia de Tiradentes
4 1 5 Dia do Trabalho
5 9 7 Revolução Constitucionalista
6 7 9 Independência do Brasil
7 12 10 Nossa Senhora Aparecida
8 2 11 Dia de Finados
9 15 11 Proclamação da República
10 20 11 Dia da Consciência Negra
11 25 12 Natal
Rodrigo Conceição
Curtidas 0
Melhor post
Emerson Nascimento
13/07/2021
para obter as datas no intervalo:
acredito que baste relacionar o resultado da pesquisa acima com a tabela de pedidos para obter o que você precisa.
select (sysdate - level) dt from dual left join feriado on to_char(feriado.mes, 'FM00') || '-' || to_char(feriado.dia, 'FM00') = to_char((sysdate - level),'MM-DD') where not (to_char(sysdate - level, 'd') in (1,7)) and feriado.dia is null and ROWNUM <= 5 connect by level <= 15 -- aqui usei 15 para ter uma folga nas datas, afinal não se sabe quantos feriados podem existir order by dt desc
GOSTEI 1
Mais Respostas
Rodrigo Conceição
12/07/2021
para obter as datas no intervalo:
acredito que baste relacionar o resultado da pesquisa acima com a tabela de pedidos para obter o que você precisa.
select (sysdate - level) dt from dual left join feriado on to_char(feriado.mes, 'FM00') || '-' || to_char(feriado.dia, 'FM00') = to_char((sysdate - level),'MM-DD') where not (to_char(sysdate - level, 'd') in (1,7)) and feriado.dia is null and ROWNUM <= 5 connect by level <= 15 -- aqui usei 15 para ter uma folga nas datas, afinal não se sabe quantos feriados podem existir order by dt desc
Amigo, antes de mais nada obrigado pela ajuda, mais fui rodar essa query e veio a seguinte mensagem
ORA-00976: A pseudocoluna ou operador especificado(a) não é permitido aqui.
00976. 00000 - "Specified pseudocolumn or operator not allowed here."
*Cause: LEVEL, PRIOR, ROWNUM, CONNECT_BY_ROOT, CONNECT_BY_ISLEAF or
CONNECT_BY_ISCYCLE was specified at an illegal location.
*Action: Remove LEVEL, PRIOR, ROWNUM, CONNECT_BY_ROOT, CONNECT_BY_ISLEAF or
CONNECT_BY_ISCYCLE.
Error at Line: 6 Column: 114
Minha dúvda é como também posso colocar essa consulta dentro do meu select, exemplo:
select * from pedidos where datacadastro >= '6 dias uteis para trás' and datacadastro <= '2 dias uteis para atrás'
Mais uma vez te agradeço
GOSTEI 0
Emerson Nascimento
12/07/2021
não tenho oracle, então fica difícil eu testar.
de qualquer forma, tente somente assim:
se funcionar, relacione com a tabela de feriados e depois com a tabela de pedidos
de qualquer forma, tente somente assim:
select (sysdate - level) dt from dual where not (to_char(sysdate - level, 'd') in (1,7)) -- lista somente os dias úteis connect by level <= 15 -- aqui usei 15 para ter uma folga nas datas, afinal não se sabe quantos feriados podem existir order by dt desc
GOSTEI 0