Jeśli wybierasz tylko według daty, oprzyj swoje obliczenia na CURDATE (co zwraca tylko datę) zamiast NOW (który zwraca datę i godzinę). Te przykłady uchwycą wszystkie czasy w zakresie dnia:
- Dzisiaj:
WHERE timestamp >= CURDATE() - Wczoraj:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE() - W tym miesiącu:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY) - Między dwiema datami 3 czerwca 2013 r. i 7 czerwca 2013 r. (zwróć uwagę, jak data końcowa jest określona jako 8 czerwca, a nie 7 czerwca):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
„Ten tydzień” zależy od tego, w którym dniu zaczynasz tydzień; Zostawię to tobie. Możesz użyć DAYOFWEEK
funkcja do dostrajania CURDATE() we właściwych zakresach.
Uzupełnienie :typ kolumny OP to INTEGER , przechowując znacznik czasu UNIX, a moja odpowiedź zakładała, że typ kolumny to TIMESTAMP . Oto jak zrobić te same rzeczy z wartością znacznika czasu UNIX i nadal utrzymywać optymalizację, jeśli kolumna jest indeksowana (tak jak powyższe odpowiedzi zrobią, jeśli TIMESTAMP kolumna jest indeksowana)...
Zasadniczo rozwiązaniem jest po prostu zawinięcie dat rozpoczęcia i/lub zakończenia w UNIX_TIMESTAMP
funkcja:
- Dzisiaj:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE()) - Wczoraj:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE()) - W tym miesiącu:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)) - Między dwiema datami 3 czerwca 2013 r. i 7 czerwca 2013 r. (zwróć uwagę, jak data końcowa jest określona jako 8 czerwca, a nie 7 czerwca):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')