Muitas vezes vejo consultas escritas com DATEADD
e DATEDIFF
na WHERE
cláusula para definir um intervalo, achatar datetime para 0 horas ou encontrar o último dia de um mês ou ano, mas não entendo como todas as partes funcionam.
Por exemplo, isso encontrará datas desde o início do dia atual até o início do dia 30 dias atrás.
SELECT *
FROM tbl
WHERE datecol >= DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)
AND datecol < DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);
O que todas as diferentes partes disso realizam?
A melhor maneira de entender como a matemática de datas funciona é dividir uma consulta em suas partes.
Comece com isso:
Neste dia específico, ele retorna
2017-10-04 19:34:20.050
.Na matemática de datas, o número 0 e a data 1900-01-01 são intercambiáveis.
O que significa que você pode converter praticamente qualquer número em uma data. Mesmo números negativos.
Isso trará de volta
1899-12-31 00:00:00.000
, que é a mesma coisa que isso:Apenas subtraindo um dia de 1900-01-01. Estranho, certo?
Como isso nos ajuda?
Vamos olhar dentro de nossa consulta original:
Isso nos dá o número de dias entre
1900-01-01
e a data atual. O que significa a expressão completa:É a adição do número de dias entre
1900-01-01
e atual a1900-01-01
. Isso nos dá o início do dia atual, às 0 horas.A segunda parte faz a mesma coisa, exceto subtrair 30 dias de
1900-01-01
, às 0 horas.Se isso é demais para lembrar, eu entendo totalmente.
Para obter uma folha de dicas de cálculos de datas importantes, consulte o artigo de Tim Ford .
Para uma tabela de calendário de datas importantes, veja o artigo de Aaron Bertrand .