- Este tópico contém 17 respostas, 8 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por abonacin.
-
AutorPosts
-
24 de novembro de 2008 às 11:43 pm #83940airoospParticipante
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.
25 de novembro de 2008 às 1:45 am #83941Leonardo LitzParticipanteCara 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
25 de novembro de 2008 às 2:35 pm #83943abonacinParticipanteQuando 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
25 de novembro de 2008 às 2:38 pm #83944Marcio68AlmeidaParticipanteTem 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’25 de novembro de 2008 às 2:45 pm #83946airoospParticipanteEntendi, 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 dualO objetivo é fazer a consulta do intervalo de datas utilizando apenas mês/ano.
Obrigado.
Airton
25 de novembro de 2008 às 3:16 pm #83948Manoel872Participanteselect 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!
25 de novembro de 2008 às 3:26 pm #83951abonacinParticipanteTem 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…
25 de novembro de 2008 às 4:51 pm #83961Rodrigo MesquitaParticipanteConcordo com o Marcio, a maneira mais segura é trabalhar com yyyymm
25 de novembro de 2008 às 6:01 pm #83963airoospParticipanteA 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?
25 de novembro de 2008 às 8:58 pm #83964AnônimoOlá !!!
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-2008NOME 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-2008SQL>
25 de novembro de 2008 às 10:37 pm #83965abonacinParticipanteConcordo 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??
25 de novembro de 2008 às 10:48 pm #83966AnônimoBoa referência sobre índice !!!
Realmente é muito interessante criarmos índices nas colunas utilizadas com muita frequencia na cláusula where.
Abrax,
Leandro
25 de novembro de 2008 às 10:54 pm #83967abonacinParticipanteFala 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…
25 de novembro de 2008 às 11:06 pm #83968airoospParticipanteBoa 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
25 de novembro de 2008 às 11:53 pm #83969Rodrigo MesquitaParticipanteNão adianta só o campo ter indice, tem que ver se ele ser usado quando for colocar o TO_CHAR, por ele ser composto
-
AutorPosts
- Você deve fazer login para responder a este tópico.