Postgresql 如何从postgres表中查找上周条目和本周条目

Postgresql 如何从postgres表中查找上周条目和本周条目,postgresql,Postgresql,我想从postgres表中找到上周的条目,周期为周一到周日,这两个日期都包括在内,例如,如果我今天查询数据,即2020/07/26,或者说如果我查询2020/07/20到2020/07/26之间的任何日期的数据,我应该得到2020/07/13到2020/07/19的数据 查询: 同样,我想找到从周一开始到现在结束的本周条目。例如,如果我今天查询数据,即2020/07/26,我应该得到2020/07/20至2020/07/26的数据。如果我查询2020/07/24,那么我应该得到2020/07/2

我想从postgres表中找到上周的条目,周期为周一到周日,这两个日期都包括在内,例如,如果我今天查询数据,即2020/07/26,或者说如果我查询2020/07/20到2020/07/26之间的任何日期的数据,我应该得到2020/07/13到2020/07/19的数据 查询:

同样,我想找到从周一开始到现在结束的本周条目。例如,如果我今天查询数据,即2020/07/26,我应该得到2020/07/20至2020/07/26的数据。如果我查询2020/07/24,那么我应该得到2020/07/20到2020/07/24 查询:

你就快到了

本周:

select user, date_sent 
from users 
where date_sent >= date_trunc('week', current_date) 
  and date_sent < date_trunc('week', current_date) + interval '1 week';
上周的情况非常相似:

select user, date_sent 
from users 
where date_sent >= date_trunc('week', current_date) - interval '1 week'
  and date_sent < date_trunc('week', current_date)

你想要的结果不一致。在您的描述中,在初始查询之前,请声明:

如果我今天查询数据,即2020/07/26,或者说如果我查询数据 在2020/07/20到2020/07/26之间的任何日期,我都应该从 2020/07/13至2020/07/19

但在该查询之后,您会声明:

如果我今天查询数据,即2020/07/26,我应该从 2020/07/20至2020/07/26

你不能两者兼得。 假设后者是正确的,并假设ISO-8601周定义,则您的请求可以重新分阶段为:

给定指定日期,如果该日期与 “当前日期”,然后返回从一周开始到当前日期的日期 指定日期,包括在内。如果指定的日期不在 本周返回日期返回星期一或之前的日期 至指定日期当天或之后的指定日期至星期日(含)

下面的代码实现了这一点

with targets (for_week_containing_date
             ,from_week_start
             ,iso_from_week
             ,iso_this_week) as 
     ( select &for_week_containing_date
            , date_trunc('week', &for_week_containing_date)
            , extract(week from &for_week_containing_date)
            , extract(week from now())
            ) 
select user, date_sent
  from user_days
 cross join targets 
 where 1=1
   and date_sent >= from_week_start
   and date_sent <= case when iso_from_week = iso_this_week
                         then for_week_containing_date
                         else from_week_start + interval '6 days'
                    end 
   ;
因为我不太关心替换变量,所以需要从脚本中绑定变量,或者将其包装到SQL函数中。看看这个例子。还要注意最后两个问题,确保您对年底前后发生的事情没有意见,并了解情况。您可能需要进行年终/年初调整。结果不是来自函数,而是来自ISO-8601定义。无论何时处理日期范围,都需要进行年终/年初检查

select user, date_sent 
from users 
where date_sent >= date_trunc('week', current_date) - interval '1 week'
  and date_sent < date_trunc('week', current_date)
with targets (for_week_containing_date
             ,from_week_start
             ,iso_from_week
             ,iso_this_week) as 
     ( select &for_week_containing_date
            , date_trunc('week', &for_week_containing_date)
            , extract(week from &for_week_containing_date)
            , extract(week from now())
            ) 
select user, date_sent
  from user_days
 cross join targets 
 where 1=1
   and date_sent >= from_week_start
   and date_sent <= case when iso_from_week = iso_this_week
                         then for_week_containing_date
                         else from_week_start + interval '6 days'
                    end 
   ;