Zapytanie postgresql dotyczące zakresu dat
Próbuję wysłać zapytanie do mojej bazy danych postgresql, aby zwrócić wyniki, w których data jest w określonym miesiącu i roku. Innymi słowy, chciałbym uzyskać wszystkie wartości dla miesiąca-roku.
Do tej pory udało mi się 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 z tym polega na tym, że muszę obliczyć pierwszą i ostatnią datę przed zapytaniem do tabeli. Czy jest na to łatwiejszy sposób?
podziękować
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Na przykład:
W takim przypadku nadal musisz obliczyć datę rozpoczęcia żądanego miesiąca, ale powinno to być proste na wiele sposobów.
Data zakończenia również została uproszczona; po prostu dodaj dokładnie jeden miesiąc. Nie zadzieraj z 28, 30, 31 itd.
Ta struktura ma również tę zaletę, że może obsługiwać użycie indeksów.
Wiele osób może zasugerować następującą formę, ale oni
nie
użyj indeksów:
Obejmuje to ocenę warunków dla każdego pojedynczego wiersza w tabeli (skanowanie) i nie używanie indeksu do znajdowania zakresu wierszy, które będą pasować (wyszukiwanie zakresu).
Anonimowy użytkownik
Potwierdzenie od:
typy zakresów
https://www.postgresql.org/doc ... .html
z PostreSQL 9.2. Możesz więc napisać to tak:
powinno to być bardziej wydajne niż porównywanie ciągów
Anonimowy użytkownik
Potwierdzenie od:
Z dokumentów:
Między symetrycznymi jest to samo, co BETWEEN, z wyjątkiem tego, że nie ma
wymagania, że argument po lewej stronie AND jest mniejszy lub równy
argument w prawo. Jeśli nie, to te dwa argumenty
są automatycznie zamieniane, więc zawsze implikowany jest niepusty zakres.
Anonimowy użytkownik
Potwierdzenie od:
Słowo kluczowe Between działa wyłącznie w przypadku daty. zakłada, że czas dla dat to 00:00:00 (tj. północ).
Anonimowy użytkownik
Potwierdzenie od:
http://www.postgresql.org/docu ... .html
http://www.postgresql.org/docs ... .html
Użyłem takiego zapytania:
lub
Juanitos Ingenier.