Ir para conteúdo
Fórum Script Brasil
  • 0

SQL para buscar entre períodos no SQL Server


rderoci

Pergunta

16 respostass a esta questão

Posts Recomendados

  • 0

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).

Link para o comentário
Compartilhar em outros sites

  • 0
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:

ALUNO

campos:

'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 i

WHERE CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),i.ano)+'/01'+'/0'+CONVERT(VARCHAR(2),i.mes)) BETWEEN

CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2009)+'/01'+'/0'+CONVERT(VARCHAR(2),12))

AND

CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2010)+'/01'+'/0'+CONVERT(VARCHAR(2),01))

Não dá certo.

Editado por rderoci
Link para o comentário
Compartilhar em outros sites

  • 0

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!!! :.)

Link para o comentário
Compartilhar em outros sites

  • 0
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 por rderoci
Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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 useroptions

Tenho:

Set Option Value

language us_english

dateformat mdy

(já usei mdy, etc...).

Link para o comentário
Compartilhar em outros sites

  • 0

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)

Link para o comentário
Compartilhar em outros sites

  • 0
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: 2009

Mes início: 10

Ano fim: 2010

Mes fim: 05

Como tenho o mes e o ano separado cada um em um campo, tá difícil mostrar o between dos dois sem usar o 'IN'.

Link para o comentário
Compartilhar em outros sites

  • 0

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)

Link para o comentário
Compartilhar em outros sites

  • 0
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 between

rs... Vou tentando aqui...

Editado por rderoci
Link para o comentário
Compartilhar em outros sites

  • 0
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 Value

language us_english

dateformat mdy

datefirst 7

Já tentei com MDY e nada... Já tentei de outras ordens e nada, também.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...