Qual seria o método preferido para velocidade e menos estresse no banco de dados usando um entre ou menor que?
SELECT LogId
FROM [Master].[dbo].log mlog
WHERE cast(LogDate as Date) BETWEEN '2019-01-01' AND '2019-12-31'
Ou seria melhor fazer isso?
SET @StartLogId = (SELECT TOP 1 LogID
FROM [Master].[dbo].log mlog
WHERE LogDate >= '2019-01-01T00:00:00.000')
SET @EndLogId = (SELECT TOP 1 LogID
FROM [Master].[dbo].log mlog
WHERE LogDate < '2019-12-31T00:00:00.000'
ORDER BY LogDate DESC);
SELECT LogId
FROM [Master].[dbo].log mlog
WHERE mlog.LogId >= @StartLogId
AND mlog.LogId <= @EndLogId;
```
Minha preferência pessoal é nunca usar
BETWEEN
, pois não é muito claro, a partir do próprio código , se o intervalo inclui2019-01-01
e2019-12-31
. Percebo que se pode facilmente verificar o manual para ver comoBETWEEN
funciona, mas na minha opinião, isso é muito mais fácil de ler, sem qualquer chance de confusão:Esteja ciente, porém, de que essa
cast(LogDate as date)
não é a maneira ideal de realizar essa consulta. A solução muito melhor seria:A declaração acima é SARGable e também garantirá que você obtenha o intervalo desejado. Na verdade, comparar
<= '2019-12-31'
significa antes de 31 de dezembro de 2019 , quando você provavelmente quer dizer até o final do dia de 31 de dezembro de 2019. Procurar datas anteriores ao início do dia seguinte garante que você obtenha todas as linhas entre o início do dia em 01-01-2019 e o final do dia em 31-12-2019.Observe que estou incluindo um
T
entre os componentes de data e hora; isso indica que o SQL Server trate o valor como uma data ISO8601 , o que evitará possíveis erros que podem ser introduzidos em instalações de idioma diferente do inglês dos EUA.