Próbuję wysłać zapytanie do mojej bazy danych postgresql, aby zwrócić wyniki, w których data przypada w określonym miesiącu i roku. Innymi słowy, chciałbym podać wszystkie wartości z miesiąca na rok.
Jak dotąd mogłem to zrobić tylko w ten sposób:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
Problem polega na tym, że przed wykonaniem zapytania w tabeli muszę obliczyć pierwszą i ostatnią datę. Czy jest na to prostszy sposób?
Dzięki
sql
postgresql
date
between
Jan
źródło
źródło
Odpowiedzi:
Dzięki datom (i godzinom) wiele rzeczy staje się prostszych, jeśli używasz
>= start AND < end
.Na przykład:
W takim przypadku nadal musisz obliczyć datę rozpoczęcia miesiąca, którego potrzebujesz, ale powinno to być proste na wiele sposobów.
Data zakończenia jest również uproszczona; po prostu dodaj dokładnie jeden miesiąc. Bez majstrowania przy 28, 30, 31 itd.
Ta struktura ma również tę zaletę, że jest w stanie utrzymać użycie indeksów.
Wiele osób może zasugerować taki formularz, jak poniższy, ale nie używają indeksów:
Obejmuje to obliczenie warunków dla każdego wiersza w tabeli (skanowanie) i nie używanie indeksu do znalezienia zakresu wierszy, które będą pasować (wyszukiwanie zakresu).
źródło
2014-12-01
&2015-01-01
. Drugi też może być indeksowany, ale przyznaję, że nie jest to trywialne -EXTRACT()
wydaje się bardziej kompatybilne.Od wersji 9.2 PostreSQL obsługiwane są typy zakresów . Możesz więc napisać to tak:
powinno to być bardziej wydajne niż porównanie ciągów
źródło
Na wypadek gdyby ktoś tu wylądował ... od 8.1 możesz po prostu użyć:
Z dokumentów:
źródło
Słowo kluczowe Between działa wyjątkowo w przypadku daty. zakłada, że dla dat jest godzina 00:00:00 (tj. północ).
źródło
Przeczytaj dokumentację.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
Użyłem takiego zapytania:
lub
Juanitos Ingenier.
źródło