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ć
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W przypadku dat (i godzin) wiele rzeczy staje się łatwiejszych, jeśli użyjesz
& > = start AND & < koniec
.
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 żą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:
WHERE
DATEPART('year', login_date) = 2014
AND DATEPART('month', login_date) = 2

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

Anonimowy użytkownik

Potwierdzenie od:

Utrzymany

typy zakresów
https://www.postgresql.org/doc ... .html
z PostreSQL 9.2. Możesz więc napisać to tak:
SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

powinno to być bardziej wydajne niż porównywanie ciągów
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Na wypadek gdyby ktoś tu wylądował ... od 8.1 wzwyż możesz po prostu użyć:
SELECT user_id 
FROM user_logs
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

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

Anonimowy użytkownik

Potwierdzenie od:

SELECT user_id 
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'

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

Anonimowy użytkownik

Potwierdzenie od:

Przeczytaj dokumentację.
http://www.postgresql.org/docu ... .html
http://www.postgresql.org/docs ... .html
Użyłem takiego zapytania:
WHERE
( date_trunc('day',table1.date_eval) = '2015-02-09')

lub
WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')

Juanitos Ingenier.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się