Z datami (i godzinami) wiele rzeczy staje się prostszych, jeśli użyjesz >= start AND < end
.
Na przykład:
SELECT
user_id
FROM
user_logs
WHERE
login_date >= '2014-02-01'
AND login_date < '2014-03-01'
W takim przypadku nadal musisz obliczyć datę rozpoczęcia miesiąca, którego potrzebujesz, ale powinno to być proste na wiele sposobów.
Uproszczono również datę zakończenia; po prostu dodaj dokładnie jeden miesiąc. Żadnych kłopotów z 28., 30., 31. itd.
Ta struktura ma również tę zaletę, że jest w stanie utrzymać wykorzystanie indeksów.
Wiele osób może sugerować formę taką jak poniższa, ale nie użyj indeksów:
WHERE
DATEPART('year', login_date) = 2014
AND DATEPART('month', login_date) = 2
Obejmuje to obliczenie warunków dla każdego wiersza w tabeli (skanowanie) i nieużywanie indeksu do znalezienia zakresu wierszy, które będą pasować (przeszukiwanie zakresu).