回答

收藏

PostgreSQL查询以选择上周的数据?

技术问答 技术问答 62 人阅读 | 0 人回复 | 2023-09-14

我有一张桌子,上面有我所有顾客购买的东西。我想选择上周(从周日开始的一周)中的所有条目。% 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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则