|
我有一张桌子,上面有我所有顾客购买的东西。我想选择上周(从周日开始的一周)中的所有条目。% B+ `: ^: A) w# I- f5 g
id value date
4 M% F( c3 n R( N8 @+ p8 x5907 1.20 "2015-06-05 09:08:34-03"$ O5 |4 w1 ~- t$ a" m' I* O
5908 120.00 "2015-06-09 07:58:12-03"& v. L+ k! M+ x ?1 P
我已经试过了:
[% @! D. n5 S N& d& N; D1 ^ nSELECT id, valor, created, FROM compras WHERE created >= now() - interval '1 week' and parceiro_id= '1'2 c7 r/ G0 Q. O, [4 g
但是我得到了上周的数据,包括本周的数据,我只想要上周的数据。' U+ Q' M( y, q+ T1 U1 @4 Z
如何只获取上周的数据?
. V. H9 D- t& ?1 I8 n
- N4 U7 X6 j% G4 y/ S7 U解决方案:
2 _; A& x7 }- U7 _+ P 9 k" u/ A" D. V
6 Q. i3 `$ T1 }5 p+ W& k, @8 f1 O- x7 i1 S; w
此条件将返回上周日至周六的记录:
9 i8 Z+ N/ n' }1 x' O3 yWHERE created BETWEEN
6 v5 K8 N* w2 I/ t6 ` NOW():ATE-EXTRACT(DOW FROM NOW())::INTEGER-7 , `& a _$ ]9 Z T7 Z5 Y j$ }0 C
AND NOW():ATE-EXTRACT(DOW from NOW())::INTEGER
3 C8 [1 Y% N9 B) w有一个例子:
. @' Y5 q/ K4 O9 ^WITH compras AS (
! `2 Q( ~% E- ~* d SELECT ( NOW() + (s::TEXT || ' day')::INTERVAL )::TIMESTAMP(0) AS created
, }' e' F9 q( X- z# ~ FROM generate_series(-20, 20, 1) AS s
/ q! a5 Q5 m$ K% A7 O% F7 k): d) X8 b Q" q Q9 q
SELECT to_char( created, 'DY'::TEXT), created, X& n# D5 b% D
FROM compras
1 I' r' O1 ?- ]; Z7 g% v8 OWHERE created BETWEEN
, Q/ {3 z$ n6 n, K3 Y NOW():ATE-EXTRACT(DOW FROM NOW())::INTEGER-7 ! U* ^* f: \0 J* y8 N/ b5 T8 q& w
AND NOW():ATE-EXTRACT(DOW from NOW())::INTEGER: d5 N3 H4 Z! Z0 b5 ~- E0 J; o8 Q
在对@ d456的回答中:
' q& f0 D, y" o, ?( R$ a3 R! Q+ }) y" i) U
BETWEEN在间隔的两端不使用星期日的午夜吗? \/ i6 _4 M& `3 ], J5 k
; c3 k% i4 [4 h' V! o/ `4 b没错,BETWEEN包括间隔两端的周日午夜。要在间隔结束时排除周日的午夜,必须使用运算符>=和+ p2 x1 ?: A2 f6 u
WITH compras AS (6 n \0 A( C1 d; P
SELECT s as created
2 S& [; F. }9 p. z$ R; e) I* T4 A FROM generate_series( -- this would produce timestamps with 20 minutes step
0 E+ \- [/ A0 X7 i (now() - '20 days'::interval)::date,
' E0 r6 f9 y- O3 c( P! P! m (now() + '20 days'::interval)::date,0 I8 N; \9 J i
'20 minutes'::interval) AS s
$ a- t# ]1 |5 f( U6 {0 p)2 M+ Z7 P: x9 i' ^# ^- b6 S
SELECT to_char( created, 'DY'::TEXT), created k, o& o, D+ \' m& {/ t
FROM compras4 V$ l( Z3 E% G
WHERE TRUE
5 o R8 c, D7 O2 x9 ], d AND created >= NOW():ATE-EXTRACT(DOW FROM NOW())::INTEGER-7
, f6 w/ q- x7 @' b5 F0 x1 C1 ] AND created < NOW():ATE-EXTRACT(DOW from NOW())::INTEGER |
|