Dias Úteis

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jerry-sc
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Ter, 01 Nov 2011 1:24 pm

Boa tarde pessoal,

Eu preciso trazer em uma única linha, a quantidade de dias úteis em um único mês e com um determinado "peso". Por exemplo: 02/05/2017 (terça-feira) o peso é 1 (considera 1 dia). Já para o dia 06/05/2017 (sábado) eu preciso que considere 0.34 dia.

Logo, eu preciso através do resultado de uma única linha ir "somando" o peso de cada dia que passou. Eu fiz esse SQL abaixo, que traz o peso do dia, mas não traz o acumulado. Talvez alguém tenha uma idéia para fazer isso. Obrigado!

Selecionar tudo

select 1 AS FILIAL,
       to_char(sysdate,'mm') AS mês,
       to_char(sysdate,'yyyy') AS ANO,
       --to_char(sysdate,'dd/mm/yyyy'),
CASE
       WHEN to_char(sysdate,'d') IN (1) THEN 0
       WHEN to_char(sysdate,'d') IN (7) THEN 0.34
       WHEN to_char(sysdate,'d') IN (2,3,4,5,6) THEN 1
END AS QUANT_DIAS_PRODUCAO
from dual

spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa tarde,

Tente assim:

Selecionar tudo

with calendario as(select trunc(sysdate) - Level Dt_Emis
                   From   dual
                   CONNECT BY LEVEL <= 7200
                   union all
                   select trunc(sysdate)  Dt_Emis
                   From   dual
                   union all
                   select trunc(sysdate) + Level Dt_Emis
                   From   dual
                   CONNECT BY LEVEL <= 7200)
select to_char(dt_emis,'mm') mês,
       to_char(dt_emis,'yyyy') ano,
sum(CASE WHEN to_char(dt_emis,'d') IN (1) THEN 0
         WHEN to_char(dt_emis,'d') IN (7) THEN 0.34
         WHEN to_char(dt_emis,'d') IN (2,3,4,5,6) THEN 1
    END) QUANT_DIAS_PRODUCAO
from   calendario
where  dt_emis between to_date('01/04/2017','dd/mm/yyyy') and to_date('31/12/2017','dd/mm/yyyy')
group by to_char(dt_emis,'mm'), to_char(dt_emis,'yyyy')
order by to_char(dt_emis,'mm'), to_char(dt_emis,'yyyy')
/
jerry-sc
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Ter, 01 Nov 2011 1:24 pm

Boa tarde.

Grato pela sua colaboração.

Ele funcionou, no entanto, talvez eu não tenha me expressado bem.

Eu preciso que ele considere os dias que já passaram. Como por exemplo, hoje ele colocaria para o mês 05, apenas 1, amanhã ele colocaria 2, e assim por diante. Apenas no sábado ele consideraria 0.34 e domingo 0.

Será que é possível fazer desta maneira?

Muito obrigado.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Você pode alterar no WHERE

Selecionar tudo

...
from calendario
where dt_emis between to_date('01/04/2017','dd/mm/yyyy') and trunc(sysdate)
ou

Selecionar tudo

...
from calendario
where dt_emis between to_date('01/04/2017','dd/mm/yyyy') and trunc(sysdate)-1

resolveria?
jerry-sc
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Ter, 01 Nov 2011 1:24 pm

Resolve sim!

Não quero abusar, mas como você é ninja... o que eu precisaria implementar, para não considerar os feriados?

Muito obrigado novamente!
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Ai fica mais divertido...

Você teria que criar tabelas de feriados, lembrando que existem feriados municipais, estaduais e nacionais.
e que existem feriados de meio período.


Dai cria uma função nestas tabelas para retornar 0 (zero) quando for feriado ou que o select não traga as datas nestas tabelas...

ex.

Selecionar tudo

from   calendario
where  dt_emis between to_date('01/04/2017','dd/mm/yyyy') and to_date('31/12/2017','dd/mm/yyyy')
and    dt_emis not in( select nas tabelas de feriado)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes