Usuário com melhor resposta
BETWEEN com mesma data

Pergunta
-
Caros Colegas
Preciso criar um Select que usa BETWEEN, até ai Blz, acontece que quando a faixa de datas é a mesma o resultado é NULO, ou vazio.
Acho que isto acontece por causa do armazenamento da hora junto com a data exemplo:
Data INICIAL Data FINAL deveri ser
15/04/2008 00:00:00 15/04/2008 23:59:59
Para funcionar teria que ser como descrito acima.
Isto tem solução no SQL 2005, digo isto porque no SQL 2008, foi implementado o atributo somente DATE.
Obrigado
Bene
Respostas
-
-
Olá Benê,
Não estou 100% certo de que o BETWEEN é mais eficiente (teríamos que testar o plano de execução para ter certeza), mas se você faz tanta questão do BETWEEN segue uma solução (que particularmente não gosto muito).
Code SnippetCREATE
TABLE #tbl (DATA SMALLDATETIME)INSERT
INTO #tbl VALUES ('20080415 00:00')INSERT
INTO #tbl VALUES ('20080415 05:59')INSERT
INTO #tbl VALUES ('20080415 09:13')INSERT
INTO #tbl VALUES ('20080415 15:42')INSERT
INTO #tbl VALUES ('20080415 18:57')INSERT
INTO #tbl VALUES ('20080415 23:59')INSERT
INTO #tbl VALUES ('20080416 00:00')DECLARE
@DATA SMALLDATETIMESET
@DATA = '20080415'SELECT
DATA FROM #tblWHERE
DATA BETWEEN @DATA AND (@DATA + 0.999)DROP
TABLE #tblEnquanto o DATE do SQL Server 2008 não vem sobram poucas alternativas
[ ]s,
Gustavo
-
Todas as Respostas
-
-
-
Verdade Thiago.
Mas aprendi que com o BETWEEN, a pesquisa é mais eficiente, mesmo porque a mesma data será uma exceção, a maioria das vezes será uma faixa de datas real e de grande abrangencia.
Mesmo assim, sua dica é válida, mas gostaria de saber se existe solução usando o BETWEEN
Obrigado
Bene
-
Olá Benê,
Não estou 100% certo de que o BETWEEN é mais eficiente (teríamos que testar o plano de execução para ter certeza), mas se você faz tanta questão do BETWEEN segue uma solução (que particularmente não gosto muito).
Code SnippetCREATE
TABLE #tbl (DATA SMALLDATETIME)INSERT
INTO #tbl VALUES ('20080415 00:00')INSERT
INTO #tbl VALUES ('20080415 05:59')INSERT
INTO #tbl VALUES ('20080415 09:13')INSERT
INTO #tbl VALUES ('20080415 15:42')INSERT
INTO #tbl VALUES ('20080415 18:57')INSERT
INTO #tbl VALUES ('20080415 23:59')INSERT
INTO #tbl VALUES ('20080416 00:00')DECLARE
@DATA SMALLDATETIMESET
@DATA = '20080415'SELECT
DATA FROM #tblWHERE
DATA BETWEEN @DATA AND (@DATA + 0.999)DROP
TABLE #tblEnquanto o DATE do SQL Server 2008 não vem sobram poucas alternativas
[ ]s,
Gustavo
-
-
-
Oi Benê,
Não estou dizendo que não seja mas também não confirmo que seja.
O grande problema de "SQL - Boas práticas" é que os autores devem lembrar de atualizá-las e muitas vezes pararem de disseminar "mitos". A cada lançamento os bancos de dados ficam mais inteligentes e muitas vezes o que era uma boa prática hoje não faz a menor diferença. Veja por exemplo duas boas práticas que foram sucesso no passado e que ainda são muito disseminadas
- Informe as tabelas na cláusula FROM da menor para a maior
- Nunca utilize instruções COUNT(*) mas sim COUNT(1) ou COUNT(0)
Tais práticas faziam diferença no passado, mas hoje simplesmente não tem o menor efeito. Não interessa a ordem das tabelas, o banco (não falo apenas pelo SQL Server) irá escolher a melhor ordem no momento de executar a consulta. Não há diferença entre usar COUNT(*), COUNT(1) ou COUNT(0). Ambas produzem exatamente o mesmo plano de execução.
No caso da data, caberia você testar as duas consultas e verificar de fato se o BETWEEN é mais eficiente (vou fazer esse teste qualquer hora dessas).
[ ]s,
Gustavo
-
Oi Benê,
Bom.. o BETWEEN realmente é melhor. O que você poderia fazer é uma rápida verificação a nível de código, antes de mandar para o banco. E dependendo, chamar uma stored procedure ou outra (ou algum procedimento que resulte no mesmo fim).
Abração,
Thiago Zavaschi