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