PostgreSQL查询从上周选择数据?

Gab*_*nor 13 sql postgresql

我有一张桌子,里面有我购买的所有顾客.我想选择上周的所有参赛作品(从星期日开始的一周).

id    value  date
5907  1.20   "2015-06-05 09:08:34-03"
5908  120.00 "2015-06-09 07:58:12-03"
Run Code Online (Sandbox Code Playgroud)

我试过这个:

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

但我得到了上周的数据,包括本周的数据,我只想要上周的数据.

如何从上周获取数据?

Nic*_*lai 20

这种情况将从上周日到周六返回记录:

WHERE created BETWEEN
    NOW()::DATE-EXTRACT(DOW FROM NOW())::INTEGER-7 
    AND NOW()::DATE-EXTRACT(DOW from NOW())::INTEGER
Run Code Online (Sandbox Code Playgroud)

有一个例子:

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
Run Code Online (Sandbox Code Playgroud)

回答@ d456:

不会BETWEEN在周日的两端使用包括午夜的午夜?

那个权利,BETWEEN包括周日午夜两个区间的午夜.要在星期日的间隔结束时排除午夜,必须使用运算符>=<:

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
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 12

默认情况下,Postgres会在周日开始几周,所以你很幸运.您可以date_trunc()用来获取上周的开头:

WHERE (created >= date_trunc('week', CURRENT_TIMESTAMP - interval '1 week') and
       created < date_trunc('week', CURRENT_TIMESTAMP)
      )
Run Code Online (Sandbox Code Playgroud)

编辑:

默认情况下,Postgres会在星期一为date_trunc开始一周,但对于周日的dow.所以,你可以通过使用尼古拉在他的答案中使用的逻辑做你想做的事.