2015-06-11 12 views
8

Mam stół, który ma wszystkie zakupy moich klientów. Chcę wybrać wszystkie wpisy z ostatniego tygodnia (tydzień od niedzieli).Zapytanie PostgreSQL, aby wybrać dane z zeszłego tygodnia?

id value date 
5907 1.20 "2015-06-05 09:08:34-03" 
5908 120.00 "2015-06-09 07:58:12-03" 

Próbowałem to:

SELECT id, valor, created, FROM compras WHERE created >= now() - interval '1 week' and parceiro_id= '1' 

Ale mam dane z ostatniego tygodnia w tym dane z tego tygodnia, chcę tylko dane z ostatniego tygodnia.

Jak uzyskać dane tylko z zeszłego tygodnia?

Odpowiedz

14

Ten warunek zwróci rekordy od niedzieli do soboty w ubiegłym tygodniu:

WHERE created BETWEEN 
    NOW()::DATE-EXTRACT(DOW FROM NOW())::INTEGER-7 
    AND NOW()::DATE-EXTRACT(DOW from NOW())::INTEGER 

Jest przykładem:

WITH compras AS (
    SELECT (NOW() + (s::TEXT || ' day')::INTERVAL)::TIMESTAMP(0) AS created 
    FROM generate_series(-20, 20, 1) AS s 
) 
SELECT to_char(created, 'DY'::TEXT), created 
FROM compras 
WHERE created BETWEEN 
    NOW()::DATE-EXTRACT(DOW FROM NOW())::INTEGER-7 
    AND NOW()::DATE-EXTRACT(DOW from NOW())::INTEGER 

W odpowiedzi na @ d456:

Wouldn Używanie BETWEEN obejmuje północ w niedzielę na obu końcach przedziału?

To prawo, BETWEEN zawiera północy w niedzielę na obu końcach przedziału. Aby wykluczyć północy w niedzielę na końcu przedziału należy używać operatorów >= i <:

WITH compras AS (
    SELECT s as created 
    FROM generate_series(-- this would produce timestamps with 20 minutes step 
      (now() - '20 days'::interval)::date, 
      (now() + '20 days'::interval)::date, 
      '20 minutes'::interval) AS s 
) 
SELECT to_char(created, 'DY'::TEXT), created 
FROM compras 
WHERE TRUE 
    AND created >= NOW()::DATE-EXTRACT(DOW FROM NOW())::INTEGER-7 
    AND created < NOW()::DATE-EXTRACT(DOW from NOW())::INTEGER 
+0

Dziękuję człowieku, twoja odpowiedź pomogła mi zdobyć ostatni tydzień i tydzień przed zeszłym tygodniem. :) –

+1

Czy użycie "BETWEEN" nie obejmuje północy w niedzielę na obu końcach przedziału? – d456

+1

@ d456, dziękuję za uwagę. Masz rację. Zaktualizowałem swoją odpowiedź. – Nicolai

9

PostgreSQL domyślnie rozpoczyna się w niedzielę, więc masz szczęście. Można użyć date_trunc() uzyskać początku poprzedniego tygodnia:

WHERE (created >= date_trunc('week', CURRENT_TIMESTAMP - interval '1 week') and 
     created < date_trunc('week', CURRENT_TIMESTAMP) 
    ) 

EDIT:

Postgres domyślnie rozpoczyna tydzień dla date_trunc w poniedziałek, ale dla dow w niedzielę. Możesz więc robić, co chcesz, używając tej logiki, którą ma Nicolai w swojej odpowiedzi.

+0

Dzięki Man: D.One więcej question.What jeśli chcę tydzień przed ostatnim tygodniu? Mam na myśli, że będę musiał uzyskać dane z tygodnia przed zeszłym tygodniem i tak dalej. –

+0

FYI [Dokumenty Postgrena 9.6] (https://www.postgresql.org/docs/9.6/static/functions-datetime.html) mówią, że tydzień rozpoczyna się domyślnie w poniedziałek, a nie w niedzielę (zgodnie z ISO-8601 .) Sprawdziłem, czy tak jest. – user9645

+0

@ user9645. . . Widzę to. Ciekawe, że wyodrębnianie DOW rozpoczyna się w niedzielę. –

Powiązane problemy