Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A partir do timestamp em SQL, selecionando registros de hoje, ontem, esta semana, este mês e entre duas datas php mysql


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')