Se você estiver selecionando apenas por data, baseie seus cálculos em
CURDATE
(que retorna apenas a data) em vez de NOW
(que retorna data e hora). Estes exemplos irão capturar todos os horários dentro dos intervalos de dias:- Hoje:
WHERE timestamp >= CURDATE()
- Ontem:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Este mês:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Entre as duas datas 3 de junho de 2013 e 7 de junho de 2013 (observe como a data de término é especificada como 8 de junho, não 7 de junho):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
O "esta semana" depende do dia em que você começa a semana; Vou deixar isso para você. Você pode usar o
DAYOFWEEK
função para ajustar CURDATE()
para os intervalos adequados. Adendo :o tipo de coluna do OP era
INTEGER
, armazenando um timestamp UNIX, e minha resposta assumiu que o tipo de coluna era TIMESTAMP
. Veja como fazer as mesmas coisas com um valor de timestamp UNIX e ainda manter a otimização se a coluna for indexada (como as respostas acima farão se o TIMESTAMP
coluna está indexada)... Basicamente, a solução é apenas envolver as datas de início e/ou término no
UNIX_TIMESTAMP
função:- Hoje:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Ontem:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Este mês:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Entre as duas datas 3 de junho de 2013 e 7 de junho de 2013 (observe como a data de término é especificada como 8 de junho, não 7 de junho):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')