Pular para o conteúdo
  • Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 9 anos atrás por Avatar de Renato José Correia LimaRenato José Correia Lima.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #107644
    Avatar de Lucas Oliveira de MouraLucas Oliveira de Moura
    Participante

      Boa tarde Forum,

      Estou com uma duvida com relação a trabalhar com DATE

      Quando eu faço: SELECT DATA+1 FROM TABELA – me retorna o campo com 1 dia a mais.

      Porém eu uso esse campo DATE no modo (YYYY/MM/DD HH24:MI:SS) e sempre preciso fazer um update de 1 segundo nesse campo.

      Atualmente eu primeiro pesquiso a data e quanto faço o update eu ja escrevo o incremento desse segundo.

      Estou tentando montar um bloco pra automatizar isso, só preciso saber como eu faço o incremento desse segundo.

      PS: o campo deve permanecer com o tipo DATE.

      Agradeço a atenção

      #107645
      Avatar de rmanrman
      Participante

        @Lucas Oliveira de Moura

        1 dia dividido por 24 horas, temos 1 hora, 1 hora divido por 60 segundos temos 1 segundo.


        SELECT SYSDATE,SYSDATE+(1/24/60) FROM DUAL;

        #107746
        Avatar de Lucas Oliveira de MouraLucas Oliveira de Moura
        Participante

          consegui da seguinte forma:


          select to_date (Max(data)) + 1/(24*60*60) segundo from(
          select max(dataocorrencia)data from tabela1 where diaocorrencia = 20150101 and idturno = '0010760280113000711438987613'
          union all
          select max(dataocorrencia)data from tabela2 where diaocorrencia = 20150101 and idturno = '0010760280113000711438987613');

          Ou seja, da tabela1 ou da tabela2 me traga a maior data daquele turno e coloque 1 segundo.

          A estrutura das tabelas é algo bem simples:
          IDTURNO, DATAOCORRENCIA, DATAFIM

          Ou seja, quando a DATAFIM está null, eu pego e preencho com 1 segundo a mais do que a DATAOCORRENCIA.

          Até aqui deu certo, ele trás um segundo perfeitamente, eu pego o resultado dessa query e faço um update. Perfeito.

          Agora eu to apanhando pra tentar automatizar isso, alguém consegue me dar um “norte”.

          Da forma que eu fiz, eu consigo trazer 1 dia só de 1 turno.

          Eu preciso fazer ele buscar um período e vários turnos dentro daquele período.

          Estou tentando um bloco anonimo com FOR mas esta difícil.

          Eu preciso que meu bloco, encontre todas as DATAFIM que sejam NULL e faça o UPDATE de 1 segundo a mais da DATAOCORRENCIA daquele IDTURNO.

          Alguma ideia?

          Agradeço a atenção.

          #107751
          Avatar de rmanrman
          Participante

            @Lucas Oliveira de Moura

            Seria isso?


            UPDATE TABELA SET DATAFIM = DATAOCORRENCIA+(1/24/60)
            WHERE IDTURNO = :IDTURNO
            AND DATAFIM IS NULL

            #107761
            Avatar de Lucas Oliveira de MouraLucas Oliveira de Moura
            Participante

              rman.. primeiramente agradeço a atenção.

              Então.. quanto a isso blz.. é bem parecido com o UPDATE que eu usei aqui… mas só q dessa forma eu farei de um a um…

              eu queria montar um bloco anonimo onde eu coloco o periodo e ele sai “varrendo” todos FIM Null daquele periodo.. aí tipo.. achou um FIM NULL? preenche esse null com 1 segunda a mais da dataocorrencia…

              estou tentando com FOR… com WHILE… ta dificil rs.. mas ja evolui algumas coisinhas aqui…

              eu não sei como fazer um FOR percorrer uma tabela usando um BETWEEN.. pq especificamente precisa ser do periodo que eu falar…

              #107762
              Avatar de rmanrman
              Participante

                @Lucas Oliveira de Moura

                Isso é um rotina dentro de um sistema, ou isso é apenas uma correção pontual?

                Se for pontual isso já resolve para todos os NULLs:


                UPDATE TABELA SET DATAFIM = DATAOCORRENCIA+(1/24/60)
                WHERE DATAFIM IS NULL

                Se for uma rotina é só criar um CURSOR, e correr passando o ID.

                #107876
                Avatar de Renato José Correia LimaRenato José Correia Lima
                Participante

                  Boa tarde,

                  Seria assim:

                  declare
                  Dt_ocorr date;
                  begin
                  select max(a.data)
                  into Dt_ocorr
                  from (select max(dataocorrencia) data from tabela1
                  where diaocorrencia = 20150101
                  and idturno = '0010760280113000711438987613'
                  union all
                  select max(dataocorrencia) data from tabela2
                  where diaocorrencia = 20150101
                  and idturno = '0010760280113000711438987613') a;
                  for reg in (select '1' tab, idturno, rowid data from tabela1
                  where diaocorrencia = 20150101
                  and idturno = '0010760280113000711438987613'
                  union all
                  select '2' tab, idturno, rowid data from tabela2
                  where diaocorrencia = 20150101
                  and idturno = '0010760280113000711438987613'
                  order by 3 asc)
                  loop
                  Dt_ocorr := Dt_ocorr+(1/24/60/60);
                  if reg.tab = '1' then
                  update tabela1 set dataocorrencia = dt_ocorr where rowid = reg.rowid;
                  else
                  update tabela2 set dataocorrencia = dt_ocorr where rowid = reg.rowid;
                  end if;
                  end loop;
                  end;
                  /

                  Att.

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress