我有一张桌子,里面有我购买的所有顾客.我想选择上周的所有参赛作品(从星期日开始的一周).
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.所以,你可以通过使用尼古拉在他的答案中使用的逻辑做你想做的事.
归档时间: |
|
查看次数: |
18715 次 |
最近记录: |