Mysql
 sql >> Database >  >> RDS >> Mysql

Dal timestamp in SQL, selezionando i record di oggi, ieri, questa settimana, questo mese e tra due date php mysql

Se selezioni solo per data, basa i tuoi calcoli su CURDATE (che restituisce solo la data) anziché NOW (che restituisce data e ora). Questi esempi cattureranno tutti gli orari negli intervalli di giorni:

  • Oggi:WHERE timestamp >= CURDATE()
  • Ieri:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • Questo mese:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Tra le due date 3 giugno 2013 e 7 giugno 2013 (notare come la data di fine è specificata come 8 giugno, non 7 giugno):WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

La "questa settimana" dipende dal giorno in cui inizi la settimana; Lo lascio a te. Puoi utilizzare DAYOFWEEK funzione per modificare CURDATE() agli intervalli appropriati.

Appendice :il tipo di colonna dell'OP era INTEGER , memorizzando un timestamp UNIX e la mia risposta presumeva che il tipo di colonna fosse TIMESTAMP . Ecco come fare tutte le stesse cose con un valore di timestamp UNIX e mantenere comunque l'ottimizzazione se la colonna è indicizzata (come faranno le risposte sopra se il TIMESTAMP colonna è indicizzata)...

Fondamentalmente, la soluzione è semplicemente racchiudere le date di inizio e/o fine in UNIX_TIMESTAMP funzione:

  • Oggi:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Ieri:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • Questo mese:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Tra le due date 3 giugno 2013 e 7 giugno 2013 (notare come la data di fine è specificata come 8 giugno, non 7 giugno):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')