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
Posted on June 18, 2011, in Select's que voce nunca esperava ver and tagged Bad T-SQL, Select's que voce nunca esperava ver, SQL Server. Bookmark the permalink. 4 Comments.
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
Oi Socorro,
Estais certíssima… Sabe o que fiz? Esse script de inserção de dados é que ta errado, eu troquei eles com o de outro post que eu também tava escrevendo naquele momento, fui conferir como estava minha tabela e nao foi inserido com horas o campo DataFim… Ainda bem que voce viu.. hehehehe
Muito Obrigado, ja vou corrigir.. 🙂
Marcos.
voce encontrou essas gambiarras no ambiente corporativo? Afffffff!
Encontrei elas em um servidor de reporting services.. 😦