Pular para o conteúdo
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #89983
    eversonpiza
    Participante

      Olá amigos.

      Estou precisando gravar em uma tabela intervalos de horas, que irei depois buscar qual o registro que o intervalo cobre o sysdate.

      Exemplo:
      HORA_INI HORA_FIM
      00:00 06:00
      06:01 17:00
      17:01 23:59

      Ai faria o select where sysdate between hora_ini e hora_fim, qual a melhor forma de fazer isso?

      Seria legal se o trunc tivesse uma opção para trazer apenas a hora, assim como faz com a data, mas não achei isso.
      Oq estou pensando em fazer é gravar as horas com uma data qquer, e toda vez converter o sysdate, pegando só a hora e concatenando com esta data dummy, mas acho que vai ficar meio feio o código.

      Oq vcs acham?

      Obrigado,
      Everson

      #89985
      Rodrigo Mesquita
      Participante

        Everson,

        Não entedi esta sua condição do seu select, where sysdate between hora_ini e hora_fim.

        #89986
        Avatar photoLeonardo Litz
        Participante

          Tenta assim:

          declare

          v_segundos number;
          v_hora date;

          begin

          for dd in 1..10 loop

          v_segundos := dbms_random.value(1,3600);
          v_hora := sysdate + ((1/24/60/60)*v_segundos);

          dbms_output.put_line(to_char(v_hora,’hh24:mi:ss’));

          end loop;

          end;

          Vlw Leonardo Litz

          #89987
          Ishii
          Participante

            Olá,

            Apenas um ponto a ser analisado. No caso de uma hora começar às 23:00 e terminar às 10:00 do SEGUNDO dia, como ficaria isso, ou isso não vai ocorrer?

            Pois a conta final seria: 35 horas e não 11…já que tenho as 24 do dia que passou…

            []s Ishii

            #89989
            Avatar photoLeonardo Litz
            Participante

              Há, para fazer a comparação, tenta assim:

              select d.dt_hr_inicio,d.dt_hr_fim
              from tabela d
              where to_char(sysdate,’hh24:mi:ss’) between d.dt_hr_inicio and d.dt_hr_fim;

              Vlw Leonardo Litz

              #89991
              Rodrigo Mesquita
              Participante

                mas dessa maneira ele só trabalharia com o horário dentro das 24 horas do dia

                #89992
                Avatar photoLeonardo Litz
                Participante

                  Sim, pelo que entendi no exemplo acima, é desta forma que se deve controlar. Caso utilize dias tb, substitua tire a formatação e utilize toda a data.

                  Vlw Leonardo Litz.

                  #89994
                  eversonpiza
                  Participante

                    Galera.
                    Antes de mais nada obrigado pela atenção.

                    Os intervalos de horas serão dentro do mesmo dia, não vai existir o caso de intervalos que passem de um dia para outro.

                    Litz neste exemplo que vc passou, como eu faço para ignorar a data (dia/mes/ano) do campo date?

                    Se eu estiver no mesmo mês blz, pois se omitir a data em um campo date ele vai pegar o dia 1º do mês atual, ou seja o sysdate hoje pegaria 01/09/2009, e na mês que vem ele vai pegar 01/10/2009, mas na tabela vai estar gravado com 01/09/2009.

                    #89995
                    Avatar photoLeonardo Litz
                    Participante

                      Faça assim:

                      Litz neste exemplo que vc passou, como eu faço para ignorar a data (dia/mes/ano) do campo date?

                      [color=red]select to_char(sysdate,'hh24:mi:ss')
                      from dual
                      [/color]

                      Se eu estiver no mesmo mês blz, pois se omitir a data em um campo date ele vai pegar o dia 1º do mês atual, ou seja o sysdate hoje pegaria 01/09/2009, e na mês que vem ele vai pegar 01/10/2009, mas na tabela vai estar gravado com 01/09/2009.

                      Vlw Leonardo Litz

                      #90041
                      fsitja
                      Participante

                        Isso que você está procurando se faz com expressões de intervalos, mais ou menos como botei no exemplo abaixo:

                        SELECT INTERVAL '22:58:30' HOUR TO SECOND "INTERVALO HH:MI:SS",
                        TO_CHAR(TRUNC(SYSDATE) + INTERVAL '22:58:30' HOUR TO SECOND, 'DD/MM/YYYY HH24:MI:SS') "SOMA SYSDATE"
                        FROM dual

                        Em caso de dúvidas dá uma olhada na documentação da Oracle abaixo:
                        http://download.oracle.com/docs/cd/E118 … SQLRF00221

                        #90042
                        fsitja
                        Participante

                          Você pode definir sua coluna da forma abaixo, restringindo via check constraint para não colocarem intervalo de dias, apenas horas, minutos e segundos.
                          A grande vantagem é fazer as operações aritméticas direto em cima de DATE e INTERVAL, somando e subtraindo sem dificuldade.


                          CREATE TABLE teste_intervalo
                          (interv_hora INTERVAL DAY TO SECOND(2),
                          CONSTRAINT ck_intervalo_hora CHECK (EXTRACT(DAY FROM (interv_hora)) = 0));

                          Table created.

                          0,03 seconds

                          insert into teste_intervalo values (INTERVAL '10:09:40' HOUR TO SECOND);

                          1 row(s) inserted.

                          insert into teste_intervalo values (INTERVAL '2 22:58:30' DAY TO SECOND);

                          ORA-02290: restrição de verificação (FSITJA.CK_INTERVALO_HORA) violada

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