Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 18 do total)
  • Autor
    Posts
  • #83940
    airoosp
    Participante

      Boa tarde,

      Alguém sabe como faço para selecionar um intervalo de registros utilizando apenas os valores mês e ano de um campo data?

      Por exemplo:

      Em uma tabela um campo data tem os valores de 01/01/2008 até 30/11/2008 como faço para selecionar apenas o intervalo entre os meses 5 a 7?

      select *
      from tabA
      where data_cadastro between to_date(dtinicio,’MM/YYYY’) and to_date(dtfim,’MM/YYYY’)

      onde dtinicio = ’05/2008′ e dtfim = ’07/2008′

      Oracle 9i.

      Obrigado.

      #83941
      Avatar photoLeonardo Litz
      Participante

        Cara vc ja tentou fazer isso aqui:

        select *
        from tabA
        where to_date(data_cadastro,’mm/yyyy’) between to_date(dtinicio,’MM/YYYY’) and to_date(dtfim,’MM/YYYY’)

        Vlw Leonardo Litz

        #83943
        abonacin
        Participante

          Quando você usa apenas o mes e ano ele pega o primeiro dia do mês… Se quiser o final do mes 07, use last_day

          select *
          from tabA
          where data_cadastro between to_date('05/2008','MM/YYYY') and last_day(to_date('07/2008','MM/YYYY'))

          flw

          #83944
          Marcio68Almeida
          Participante

            Tem uma pequena falha nessa consulta pois 06/1999 é maior que 05/2008 e menor que 07/2008 porém não é um valor válido…
            O ideal, para evitar qualquer tipo de problemas é usar ano/mês ‘yyyy/mm’

            #83946
            airoosp
            Participante

              Entendi, só que é necessário fazer a consulta utilizando o formato de data pois o campo é neste formato, o problema é que ao executar o comando abaixo, o Oracle acrescenta 01 no início e o campo fica formatado com DD/MM/YYYY e não YYYY/MM.

              select to_date(to_char(to_date(&pdtinicio,’DD/MM/YYYY’),’YYYY/MM’),’YYYY/MM’)
              from dual

              O objetivo é fazer a consulta do intervalo de datas utilizando apenas mês/ano.

              Obrigado.

              Airton

              #83948
              Manoel872
              Participante

                select to_char(SYSDATE,’YYYYMM’)
                from dual
                WHERE to_char(CAMPOFILTRO,’YYYYMM’) BETWEEN to_char(VARIAVEL1,’YYYYMM’) AND
                to_char(VARIAVEL2,’YYYYMM’)

                Assim vai funcionar… Eu acho!

                #83951
                abonacin
                Participante

                  Tem uma pequena falha nessa consulta pois 06/1999 é maior que 05/2008 e menor que 07/2008 porém não é um valor válido…

                  Acho que você deve ter se enganado Marcio…

                  O campo é date, não haverá este problema…

                  Utilizando o last_day acho que resolve o problema…

                  #83961
                  Rodrigo Mesquita
                  Participante

                    Concordo com o Marcio, a maneira mais segura é trabalhar com yyyymm

                    #83963
                    airoosp
                    Participante

                      A função last_day terá que ser utilizada pois o Oracle acrescenta 01 na data inicial e final, para considerar todo o mês na data final utilizar a função last_day, certo?

                      A máscara mes/ano somente com o to_char, com o to_date não funciona apenas com estes dois valores.

                      Alguém conseguiu utilizar o to_date apenas com mês e ano?

                      #83964
                      Anônimo

                        Olá !!!

                        Segue abaixo um teste que eu fiz e pelo que percebi funcionou perfeitamente….

                        SQL>create table tabGPO (nome varchar2(20), dataMovto date);
                        Table created.

                        SQL>insert into tabGPO values (‘Primeiro’, to_date(’15-01-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Segundo’, to_date(’15-02-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Terceiro’, to_date(’01-03-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Quarto’, to_date(’15-03-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Quinto’, to_date(’31-03-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Sexto’, to_date(’15-04-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Setimo’, to_date(’15-05-2008′, ‘DD-MM-RRRR’));

                        SQL>insert into tabGPO values (‘Oitavo’, to_date(’15-06-2008′, ‘DD-MM-RRRR’));

                        SQL>select nome, dataMovto, to_char(dataMovto, ‘MM-RRRR’) DataFormatada
                        2 from tabGPO
                        3 where to_char(dataMovto, ‘MM-RRRR’) between ‘&dtInicio’ and ‘&dtFim’
                        4 order by 3;

                        Enter value for dtinicio: 02-2008
                        Enter value for dtfim: 04-2008

                        NOME DATAMOVTO DATAFOR
                        ——————– ——— ——-
                        Segundo 15-FEB-08 02-2008
                        Terceiro 01-MAR-08 03-2008
                        Quarto 15-MAR-08 03-2008
                        Quinto 31-MAR-08 03-2008
                        Sexto 15-APR-08 04-2008

                        SQL>

                        #83965
                        abonacin
                        Participante

                          Concordo com seu exemplo Leandro…

                          Só queria adicionar um comentário…

                          Se a tabela for razoavelmente grande deve-se atentar a existencia de índices… Se o campo for date, eu criaria um índice simples…

                          create index idx_GPO on tabGPO(dataMovto);

                          Airoosp, existe índice neste campo??

                          #83966
                          Anônimo

                            Boa referência sobre índice !!!

                            Realmente é muito interessante criarmos índices nas colunas utilizadas com muita frequencia na cláusula where.

                            Abrax,

                            Leandro

                            #83967
                            abonacin
                            Participante

                              Fala Leandro…

                              O que eu quis dizer, é que se o indice for criado como eu sugeri, a consulta com o TO_CHAR não vai utilizá-lo…

                              #83968
                              airoosp
                              Participante

                                Boa tarde,

                                O campo data possue índice mas não é único há mais campos que compõe este índice.

                                Leandro, vou fazer um teste com o exemplo que você passou.

                                Airton

                                #83969
                                Rodrigo Mesquita
                                Participante

                                  Não adianta só o campo ter indice, tem que ver se ele ser usado quando for colocar o TO_CHAR, por ele ser composto

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