[SQL ORACLE ] QUERY COM INTERVADO DE DATA, RETIRANDO OS FERIADOS

SQL

Oracle PL SQL

12/07/2021

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
Rodrigo Conceição

Rodrigo Conceição

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

13/07/2021

para obter as datas no intervalo:
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
acredito que baste relacionar o resultado da pesquisa acima com a tabela de pedidos para obter o que você precisa.
GOSTEI 1

Mais Respostas

Rodrigo Conceição

Rodrigo Conceição

12/07/2021

para obter as datas no intervalo:
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
acredito que baste relacionar o resultado da pesquisa acima com a tabela de pedidos para obter o que você precisa.


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

Emerson Nascimento

12/07/2021

não tenho oracle, então fica difícil eu testar.
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
se funcionar, relacione com a tabela de feriados e depois com a tabela de pedidos
GOSTEI 0
POSTAR