2015-06-11 16 views
8

Ho un tavolo che ha tutti gli acquisti dei miei clienti. Voglio selezionare tutte le voci dell'ultima settimana, (settimana a partire da domenica).Query PostgreSQL per selezionare i dati della settimana scorsa?

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

Ho provato questo:

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

Ma ho avuto i dati dalla scorsa settimana inclusi i dati pubblicati questa settimana, voglio solo i dati dalla scorsa settimana.

Come ottenere dati solo dalla scorsa settimana?

risposta

14

Questa condizione restituirà i record dalla Domenica al Sabato la scorsa settimana:

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

C'è un esempio:

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 

In risposta a @ d456:

Wouldn utilizzare BETWEEN include la mezzanotte della domenica ad entrambe le estremità dell'intervallo?

Tale diritto, BETWEEN include la mezzanotte della domenica ad entrambe le estremità dell'intervallo. Per escludere la mezzanotte di Domenica al termine dell'intervallo è necessario utilizzare gli operatori >= e <:

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

Grazie amico, la tua risposta mi ha aiutato a ottenere l'ultima settimana e la settimana prima della scorsa settimana. :) –

+1

Non usare 'BETWEEN' include la mezzanotte della domenica ad entrambe le estremità dell'intervallo? – d456

+1

@ d456, grazie per l'avviso. Hai ragione. Ho aggiornato la mia risposta. – Nicolai

9

Postgres di default inizia settimane di domenica, quindi sei fortunato. È possibile utilizzare date_trunc() per ottenere l'inizio della settimana precedente:

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

EDIT:

Postgres per impostazione predefinita inizia settimana per date_trunc il Lunedi, ma per dow Domenica. Quindi, puoi fare ciò che vuoi usando quella logica, che Nicolai ha nella sua risposta.

+0

Grazie uomo: D.One più question.What se voglio la settimana prima la scorsa settimana? Voglio dire, avrò bisogno di ottenere dati dalla settimana prima della scorsa settimana e così via. –

+0

FYI i [Postgres 9.6 docs] (https://www.postgresql.org/docs/9.6/static/functions-datetime.html) dicono che la settimana inizia di default lunedì, non domenica (secondo ISO-8601 .) Ho verificato che sia così. – user9645

+0

@ user9645. . . Capisco. È interessante notare che l'estrazione di DOW inizia la settimana di domenica. –

Problemi correlati