rderoci Postado Setembro 6, 2010 Denunciar Share Postado Setembro 6, 2010 Olá pessoal!!!Tenho na minha tabela os seguintes campo: 'ANO' e 'MES'Como faço, no SQL Server, para buscar um período, por exemplo, entre o ANO 2009 MES 12 E ANO 2010 MES 2?Obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabiojdc Postado Setembro 6, 2010 Denunciar Share Postado Setembro 6, 2010 Olá pessoal!!!Tenho na minha tabela os seguintes campo: 'ANO' e 'MES'Como faço, no SQL Server, para buscar um período, por exemplo, entre o ANO 2009 MES 12 E ANO 2010 MES 2?Obrigado.select * from sua tabelawhere periodo between '20091201' and '20100231'abraço.Fabio Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thiago0803 Postado Setembro 8, 2010 Denunciar Share Postado Setembro 8, 2010 Ou também pode usar o mais "incorreto", seria o periodo <= 'data' AND periodo => 'data'+- isso!!Mas use between.Aproveitando, conheça a função datediff(X, Campo1, Campo2)**O X pode ser day, month, year. Ela te mostra a diferença entre 2 campos data, seja em anos, meses ou dias(o que você escolher). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 8, 2010 Autor Denunciar Share Postado Setembro 8, 2010 (editado) Ou também pode usar o mais "incorreto", seria o periodo <= 'data' AND periodo => 'data'+- isso!!Mas use between.Aproveitando, conheça a função datediff(X, Campo1, Campo2)**O X pode ser day, month, year. Ela te mostra a diferença entre 2 campos data, seja em anos, meses ou dias(o que você escolher).Acho que você não entendeu...Vou dar um exemplo:tabela:ALUNOcampos:'ANO' (SMALLINT), 'MES'(SMALLINT) e 'MATRICULA'como faço um between para me retornar somente as matriculas entre 12/2009 e 01/2010 (mês/ano)estou tentando da seguinte forma:SELECT top 100 CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),i.ano)+'/01'+'/0'+CONVERT(VARCHAR(2),i.mes))from ALUNO iWHERE CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),i.ano)+'/01'+'/0'+CONVERT(VARCHAR(2),i.mes)) BETWEENCONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2009)+'/01'+'/0'+CONVERT(VARCHAR(2),12))ANDCONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2010)+'/01'+'/0'+CONVERT(VARCHAR(2),01))Não dá certo. Editado Setembro 8, 2010 por rderoci Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 8, 2010 Denunciar Share Postado Setembro 8, 2010 Boa tarde Amigo, Entedi o problema. A única dúvida é a entrada dos dados de pesquisa... Quando você diz q a data de pesquisa está entre 12/2009 e 01/2010, a data está neste formato? O problema de utilizar comparações de datas com campos numéricos, é á diferença no modo de comparação: - Para você saber se uma data é menor que a outra, é necessário ter o ano. - Para saber se um número é menor que o outro, apenas uma comparação simples basta. É um pouco "lógico" eu falar isto, mas quando se programa, as coisas não ficam tão lógicas.... rs. Vi que faz o convert pra concatenar os campos das datas. O que me parece que está faltando é a conversão da data concatenada para o tipo DATA. Ai, você poderá fazer uma comparação entre datas. Desta forma, você está comparando string com string. Ficaria mais ou menos assim:select cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) from ALUNO where cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) BETWEEN cast(('2009' + '/01/'+ convert(varchar,mes)) as datetime) and cast(('2010' + '/01/'+ convert(varchar,mes)) as datetime) CONSIDERAÇÕES: - Perceba que não converti o ano de pesquisa 2009 e nem 2010. Basta colocar aspas simples para identifica pro sql que é caracteres. Se não colocar, a função + tentará somar, e não concatenar. - Atenção ao formato da data. Vi que no seu exemplo colocou AAAADDMM. Verifique se o formato está ok. - Colocou também o acrescimo de 0 no mês. Na conversão, o sql "entede" o formato e já ajusta o campo. Espero que ajude a resolver o problema... Qualquer dúvida, posta ai!!! :.) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 8, 2010 Autor Denunciar Share Postado Setembro 8, 2010 (editado) Boa tarde Amigo, Entedi o problema. A única dúvida é a entrada dos dados de pesquisa... Quando você diz q a data de pesquisa está entre 12/2009 e 01/2010, a data está neste formato? O problema de utilizar comparações de datas com campos numéricos, é á diferença no modo de comparação: - Para você saber se uma data é menor que a outra, é necessário ter o ano. - Para saber se um número é menor que o outro, apenas uma comparação simples basta. É um pouco "lógico" eu falar isto, mas quando se programa, as coisas não ficam tão lógicas.... rs. Vi que faz o convert pra concatenar os campos das datas. O que me parece que está faltando é a conversão da data concatenada para o tipo DATA. Ai, você poderá fazer uma comparação entre datas. Desta forma, você está comparando string com string. Ficaria mais ou menos assim:select cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) from ALUNO where cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) BETWEEN cast(('2009' + '/01/'+ convert(varchar,mes)) as datetime) and cast(('2010' + '/01/'+ convert(varchar,mes)) as datetime) CONSIDERAÇÕES: - Perceba que não converti o ano de pesquisa 2009 e nem 2010. Basta colocar aspas simples para identifica pro sql que é caracteres. Se não colocar, a função + tentará somar, e não concatenar. - Atenção ao formato da data. Vi que no seu exemplo colocou AAAADDMM. Verifique se o formato está ok. - Colocou também o acrescimo de 0 no mês. Na conversão, o sql "entede" o formato e já ajusta o campo. Espero que ajude a resolver o problema... Qualquer dúvida, posta ai!!! :.) Fiz aqui: select cast((convert(varchar,I.ANO) + '/01/' + convert(varchar,I.MES)) as datetime) from ITEM_CARNE I where cast((convert(varchar,I.ANO) + '/01/' + convert(varchar,I.MES)) as datetime) BETWEEN cast(('2009' + '/01/'+ convert(varchar,I.MES)) as datetime) and cast(('2010' + '/01/'+ convert(varchar,I.MES)) as datetime)e me apareceu o seguinte erro:1)The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.e 2)Quando dou um select, por exemplo, entre os meses 1 e 8, ele me retorna, também, os meses 10, 11 e 12, pois está buscando como se fosse um like do mês 1, entendeu?Vou continuar tentando aqui mas estou aberto a sugestões.... ;p Editado Setembro 8, 2010 por rderoci Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 8, 2010 Denunciar Share Postado Setembro 8, 2010 Dé uma olhada no formato da data. Este erro é porque está tentando converter pra uma data que não existe. Se você trocar o mês pelo dia, dá erro de conversão, entendeu? Ex.: você está falando que é o dia 20, mas na conversão o sql está entendendo que o mês é 20. Como não existe, aparece o erro de conversão. Se o formato for em inglês, faça AAAAMMDD. Provavelmente deve ser este... apenas troque a ordem do dia pelo mês. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 8, 2010 Autor Denunciar Share Postado Setembro 8, 2010 Dé uma olhada no formato da data. Este erro é porque está tentando converter pra uma data que não existe. Se você trocar o mês pelo dia, dá erro de conversão, entendeu? Ex.: você está falando que é o dia 20, mas na conversão o sql está entendendo que o mês é 20. Como não existe, aparece o erro de conversão. Se o formato for em inglês, faça AAAAMMDD. Provavelmente deve ser este... apenas troque a ordem do dia pelo mês.Já tentei com todas as formas possíveis... mas tudo resultou nesse mesmo erro...executando os options: dbcc useroptionsTenho: Set Option Valuelanguage us_englishdateformat mdy(já usei mdy, etc...). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 9, 2010 Denunciar Share Postado Setembro 9, 2010 Dê uma olhada então nos dados que está tentando converter. Faz um select pra ver se existe algum mês fora do intervalo de 1 a 12. Mesmo esquema com os anos (creio que este ai não será o problema). Fiz um exemplo gerando o erro que postou:select cast ('2010-15-15' as datetime) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 14, 2010 Autor Denunciar Share Postado Setembro 14, 2010 Dê uma olhada então nos dados que está tentando converter. Faz um select pra ver se existe algum mês fora do intervalo de 1 a 12. Mesmo esquema com os anos (creio que este ai não será o problema). Fiz um exemplo gerando o erro que postou:select cast ('2010-15-15' as datetime)Caros amiguinhos... Ainda não consegui!Alguém tem uma luz?Resumindo:Tenho na tabela X, dois campos: 'ANO'(SMALLINT) e 'MES'(SMALLINT)devo buscar datas entre eles, onde no sistema eu colocaria:Ano início: 2009Mes início: 10 Ano fim: 2010Mes fim: 05Como tenho o mes e o ano separado cada um em um campo, tá difícil mostrar o between dos dois sem usar o 'IN'. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 14, 2010 Denunciar Share Postado Setembro 14, 2010 Rs... postei um exemplo completo pra vc. Criei uma tabela temporária nos moldes de sua base. Dê uma olhada se é isto mesmo. Segue script comentado:-- Criação de temporária create table #ITEM_CARNE (Mes SMALLINT, Ano SMALLINT) -- Inserção de dados insert into #ITEM_CARNE values (08, 2009) insert into #ITEM_CARNE values (09, 2009) insert into #ITEM_CARNE values (10, 2009) insert into #ITEM_CARNE values (1, 2010) insert into #ITEM_CARNE values (3, 2010) insert into #ITEM_CARNE values (5, 2010) insert into #ITEM_CARNE values (6, 2010) -- Conferência select * from #ITEM_CARNE -- Seleciona daqui até o final e roda Declare @AnoInicio SMALLINT Declare @MesInicio SMALLINT Declare @AnoFim SMALLINT Declare @MesFim SMALLINT select * from #ITEM_CARNE -- Pra alternar a data de pesquisa, altera os valores das variáveis Set @AnoInicio = 2009 Set @MesInicio = 10 Set @AnoFim = 2010 Set @MesFim = 05 select cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime), * from #ITEM_CARNE where cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime) BETWEEN cast((cast(@AnoInicio as varchar) + '/'+ cast(@MesInicio as varchar) + '/01') as datetime) and cast((cast(@AnoFim as varchar) + '/'+ cast(@MesFim as varchar) + '/01') as datetime) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 14, 2010 Autor Denunciar Share Postado Setembro 14, 2010 (editado) Rs... postei um exemplo completo pra vc. Criei uma tabela temporária nos moldes de sua base. Dê uma olhada se é isto mesmo. Segue script comentado:-- Criação de temporária create table #ITEM_CARNE (Mes SMALLINT, Ano SMALLINT) -- Inserção de dados insert into #ITEM_CARNE values (08, 2009) insert into #ITEM_CARNE values (09, 2009) insert into #ITEM_CARNE values (10, 2009) insert into #ITEM_CARNE values (1, 2010) insert into #ITEM_CARNE values (3, 2010) insert into #ITEM_CARNE values (5, 2010) insert into #ITEM_CARNE values (6, 2010) -- Conferência select * from #ITEM_CARNE -- Seleciona daqui até o final e roda Declare @AnoInicio SMALLINT Declare @MesInicio SMALLINT Declare @AnoFim SMALLINT Declare @MesFim SMALLINT select * from #ITEM_CARNE -- Pra alternar a data de pesquisa, altera os valores das variáveis Set @AnoInicio = 2009 Set @MesInicio = 10 Set @AnoFim = 2010 Set @MesFim = 05 select cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime), * from #ITEM_CARNE where cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime) BETWEEN cast((cast(@AnoInicio as varchar) + '/'+ cast(@MesInicio as varchar) + '/01') as datetime) and cast((cast(@AnoFim as varchar) + '/'+ cast(@MesFim as varchar) + '/01') as datetime)Aí dá: A conversão de um tipo de dados char em um tipo de dados datetime resultou em um valor datetime fora do intervalo.No momento do betweenrs... Vou tentando aqui... Editado Setembro 14, 2010 por rderoci Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 14, 2010 Denunciar Share Postado Setembro 14, 2010 O script não funcionou? Testei aqui na minha máquina e funcionou certinho. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 14, 2010 Autor Denunciar Share Postado Setembro 14, 2010 O script não funcionou? Testei aqui na minha máquina e funcionou certinho.Deve ser as configurações de data no meu gerenciador...Fazendo esta consuta:select cast((convert(varchar,2010) + '/' + convert(varchar,2) + '/01') as datetime)me retorna: 01/2/2010E no seu? 2010/2/01 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 14, 2010 Denunciar Share Postado Setembro 14, 2010 Então inverte os dias, meses e anos (igual o post que postei lá em cima). O formato da data no Banco é fundamental!! No meu Banco está YYYY-MM-DD. Olhe o formato do seu e inverta o script para que as datas fiquem corretas. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 rderoci Postado Setembro 14, 2010 Autor Denunciar Share Postado Setembro 14, 2010 Então inverte os dias, meses e anos (igual o post que postei lá em cima). O formato da data no Banco é fundamental!! No meu Banco está YYYY-MM-DD. Olhe o formato do seu e inverta o script para que as datas fiquem corretas.Minha configuração:Set Option Valuelanguage us_englishdateformat mdydatefirst 7Já tentei com MDY e nada... Já tentei de outras ordens e nada, também. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 14, 2010 Denunciar Share Postado Setembro 14, 2010 acho q faz diferenca se você usar '/' ou '-'.você podia tentar o codigo do fulvio com '-' pra ver se vai:cast((convert(varchar,ANO) + '-' + convert(varchar,MES) + '-01') as datetime) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
rderoci
Olá pessoal!!!
Tenho na minha tabela os seguintes campo: 'ANO' e 'MES'
Como faço, no SQL Server, para buscar um período, por exemplo, entre o ANO 2009 MES 12 E ANO 2010 MES 2?
Obrigado.
Link para o comentário
Compartilhar em outros sites
16 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.