Função que retorne uma data inicial e uma final.

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
Tony Joni Duran
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 21 Nov 2016 9:08 am

Boa tarde amigos desenvolvedores. Essa é minha primeira postagem e gostaria de um ajudinha dos amigos.
Preciso elaborar uma função que retorne dentre vários registros de datas a data inicial e a final dentre aqueles registros que estejam vamos dizer concatenadas entre si.
Ex:

Selecionar tudo

1  - 01/01/2016 00:00:00	17/03/2016 00:00:00	40
2 - 18/03/2016 00:00:00	15/06/2016 00:00:00	40
3  16/06/2016 00:00:00	15/07/2016 00:00:00	40
4 - 16/07/2016 00:00:00	31/12/2016 00:00:00	30
Reparem que o registro da primeira data inicial 01/01/2016 e finaliza na data 15/07/2016 por serem sequenciais (concatenda) termina na data 15/07/2016. Logicamente que deverei criar uma função pra cada busca uma pra data inicial e outra pra data final.
Espero ter sido claro.
Abraços caros colegas.
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 Tony,

Tem como você postar a estrutura da sua tabela?

Existem as funções MIN e MAX, a gente precisa ver se da pra usar para atender.
Tony Joni Duran
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 21 Nov 2016 9:08 am

oLÁ..BOA TARDE spernega..eu já tentei esse ecurso, porém ele retorna mais de uma linha por se ter codigos diferentes na chamada do select.
Segue aí pra você verificar.

Selecionar tudo

SELECT
       T.NUMFUNC, T.NUMVINC,t.dtini, t.dtfim, t.codigo
         FROM
         (
         SELECT L.NUMFUNC, L.NUMVINC,
         (
                  CASE WHEN L.DTINI <=to_date('01/01/2016','dd/mm/yyyy')
                       THEN to_date('01/01/2016','dd/mm/yyyy')
                 ELSE L.DTINI
                  END
         ) DTINI,

         (
                  CASE WHEN (L.DTFIM >=LAST_DAY(to_date('01/12/2016','dd/mm/yyyy')) OR L.DTFIM IS NULL)
                       THEN to_date('31/12/2016','dd/mm/yyyy')
                 ELSE L.DTFIM
                  END
         ) DTFIM, I.ITEM CODIGO
          FROM ITEMTABELA I, LIC_AFAST L, CODIGOS_FREQ_ F, VINCULOS V
           WHERE L.NUMFUNC= 381454--WNUMFUNC
           AND L.NUMVINC = 1--WNUMVINC
           AND L.CODFREQ = F.CODIGO
           AND L.NUMFUNC = V.NUMFUNC
           AND L.NUMVINC = V.NUMERO
           AND (
        (TO_CHAR(L.DTINI,'YYYY')='2016' OR TO_CHAR(L.DTFIM,'YYYY')='2016')
   or    (L.DTFIM IS NULL  AND TO_CHAR(L.DTINI,'YYYY')<='2016')
   OR  (TO_CHAR(L.DTINI,'YYYY') <='2016' AND TO_CHAR(L.DTFIM,'YYYY') >='2016')

      )

           AND V.EMP_CODIGO = 1--WEMPRESA
           AND I.ITEM = F.FLEX_CAMPO_03
           --AND I.ITEM = PCODIGO
           AND NVL(V.FORMAVAC,' ') <> 'EXCLUSAO'
           AND I.TAB = 'RAIS_AFASTAMENTO_MTE'
           AND V.DTEXERC = '02/05/2007'--PDTEXERC
           AND I.ITEM > 0
      ) T
      GROUP BY T.NUMFUNC, T.NUMVINC,t.dtini, t.dtfim, t.codigo

      order by 3

essa sql traz aquela relação de datas que postei anteriormente.
abraço.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Tony,

Tenta fazer dessa forma, fazendo um GROUP BY pelo código

Selecionar tudo

SELECT x.codigo,
       min(x.dtini) dtini, 
       max(x.dtfim) dtfim, 
from   (       
SELECT T.NUMFUNC, 
       T.NUMVINC,
       t.dtini, 
       t.dtfim, 
       t.codigo
FROM   (SELECT L.NUMFUNC, L.NUMVINC,
                --
               (CASE WHEN L.DTINI <=to_date('01/01/2016','dd/mm/yyyy') THEN 
                     to_date('01/01/2016','dd/mm/yyyy')
                ELSE 
                     L.DTINI
                END) DTINI,
                --
                ( CASE WHEN (L.DTFIM >=LAST_DAY(to_date('01/12/2016','dd/mm/yyyy')) OR L.DTFIM IS NULL) THEN 
                       to_date('31/12/2016','dd/mm/yyyy')
                  ELSE 
                       L.DTFIM
                  END) DTFIM, I.ITEM CODIGO
                --
        FROM   ITEMTABELA I, LIC_AFAST L, CODIGOS_FREQ_ F, VINCULOS V
        WHERE  L.NUMFUNC= 381454 --WNUMFUNC
        AND    L.NUMVINC = 1 --WNUMVINC
        AND    L.CODFREQ = F.CODIGO
        AND    L.NUMFUNC = V.NUMFUNC
        AND    L.NUMVINC = V.NUMERO
        AND    ((TO_CHAR(L.DTINI,'YYYY')='2016' OR TO_CHAR(L.DTFIM,'YYYY')='2016') or 
                (L.DTFIM IS NULL AND TO_CHAR(L.DTINI,'YYYY')<='2016') OR 
                (TO_CHAR(L.DTINI,'YYYY') <='2016' AND TO_CHAR(L.DTFIM,'YYYY') >='2016'))
        AND    V.EMP_CODIGO = 1  --WEMPRESA
        AND    I.ITEM = F.FLEX_CAMPO_03
        AND    NVL(V.FORMAVAC,' ') <> 'EXCLUSAO'
        AND    I.TAB = 'RAIS_AFASTAMENTO_MTE'
        AND    V.DTEXERC = '02/05/2007'--PDTEXERC
        AND    I.ITEM > 0) T
GROUP BY T.NUMFUNC, T.NUMVINC,t.dtini, t.dtfim, t.codigo) x
group by x.codigo
order by 1

Nesse teste estou desprezando NUMFUNC e NUMVINC, é só pra ver se trás um resultado mais ou menos correto...
Tony Joni Duran
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 21 Nov 2016 9:08 am

E aí amigo..sua sql caiu como uma luva, porém acabou infringindo em outras regras..rsrsrs
Na verdade quando tenho um periodo concatenado blza, seu código deu certo, porém tem os casos em q os periodos são separados por lacunas(periodos) e a sua sql acaba trazendo dataini e data final de todo esse periodo.
Mas de quqlquer forma já me ajudou pra caramba.
Caso você tenha mais idéias aí..aceito. grande abraço irmão!
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Tony,

Bom, meio caminho andado!!

Me explica melhor como é essa concatenação, essa parte eu não entendi direito...
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 6 visitantes