Select’s que voce nunca esperava ver Post 01

Ola Pessoal,

Nesse blog inicia-se a serie: Select's que voce nunca esperava em ver.
É isso mesmo que você lê, o objetivo aqui é mostrar certas gambiarras que você pode encontrar por ai, mas que com um pouco de dedicação tudo pode se tornar mais facil. 
O primeiro caso (real) começa agora.

Quero consultar dados a partir de uma range de datas (sem o horário), 
porem nao quero utilizar a expressao >= e <=, para ficar mais facil poderemos utilizar somente > e <.

create table #temp (id int identity(1,1), mensagem varchar (200),
datainicio datetime, dataFim datetime)

insert into #temp values ('mensagem 01','20110101','20110617') insert into #temp values ('mensagem 02','20110102','20110617') insert into #temp values ('mensagem 03','20110103','20110617') insert into #temp values ('mensagem 04','20110104','20110617') insert into #temp values ('mensagem 05','20110103','20110614') insert into #temp values ('mensagem 06','20110304','20110614') insert into #temp values ('mensagem 07','20110504','20110614') insert into #temp values ('mensagem 08','20110504','20110618') insert into #temp values ('mensagem 09','20110504','20110621')
Agora o que se faz necessário é pegar todos os dados onde a data de inicio é maior e igual a 02/01/2011 e a data fim é menor e igual a 14/06/2011.

Simples basta realizarmos essa consulta:
select * from temp
where datainicio > dateadd(dd,1,'20101231')
and dataFim < DATEADD(DD,1,'20110614')
Viu? Olha que abordagem mais fácil.. Por que não usar essa consulta na parte de cima ao invés dessa:
select * from temp
where datainicio >= '20110102'
and dataFim <= '20110614'
Entao pessoal, hoje foi o primeiro post de uma serie que esta por vir, 
vou tentar postar o máximo de casos reais possiveis como esse de hoje.
Marcos Freccia
MCTS SQL Server 2008
@SQLFreccia

Sobre Marcos Freccia

MVP em SQL Server (Data Plataform) , especialista em SQL Server, e atualmente trabalhando com Microsoft Azure!

Publicado em junho 18, 2011, em Select's que voce nunca esperava ver e marcado como , , . Adicione o link aos favoritos. 4 Comentários.

  1. Como você criou o campo com datetime e deseja retornar os registros com datafim ’14/06/2011′ sem importar a hora que foi gravado, você precisa acrescentar a hora no valor da data. Caso contrário, o retorno da query será errado.
    Na primeira query, não é preciso fazer nada, pois o valor já é datafim < '201106015 00:00:00' (calculando o dateadd), então trará resultados até do dia '14/06/2011 23:59:59'
    Entretanto, a maneira escrita na segunda query, ou seja, sem a hora explicíta, o SQL Server entende que deve retornar somente os registros até 00:00:00 do dia 14.
    Dessa forma, todos os demais registros que foram inseridos ao longo do dia 14 não serão retornados. Logo, para a query retornar o resultset correto, é preciso que o filtro seja datafim <= '20110614 23:59:59'

    Outro fator legal de dizer que é o execution plan das duas queries são iguais, então é pura gambiarra mesmo hehehe

    []'s
    Socorro Vieira

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: