You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL按周过滤查询:当前周及指定年周的SELECT实现

嗨,这两个需求在PostgreSQL里都有很直接的实现方式,我帮你拆解一下:

一、筛选当前周(周日至周六)的数据

PostgreSQL默认的date_trunc('week', ...)是从周一开始计算的,所以要适配周日到周六的范围,我们需要对起始日期做一点偏移:

SELECT * 
FROM your_table
WHERE datecolumn >= date_trunc('week', CURRENT_DATE) - INTERVAL '1 day'
  AND datecolumn < date_trunc('week', CURRENT_DATE) + INTERVAL '7 days';

代码解释:

  • date_trunc('week', CURRENT_DATE)会返回当前周周一的零点时间,减1天就得到本周日的零点,作为筛选的起始时间。
  • 加7天则得到下周日的零点,用<而不是<=,可以完整包含周六当天所有非零点的时间数据(避免BETWEEN导致的闭区间遗漏问题)。

如果你想基于当前日期动态计算周范围,也可以用extract(dow ...)函数(dow返回0=周日,6=周六):

SELECT *
FROM your_table
WHERE datecolumn >= CURRENT_DATE - (extract(dow FROM CURRENT_DATE) || ' days')::INTERVAL
  AND datecolumn < CURRENT_DATE + (6 - extract(dow FROM CURRENT_DATE) || ' days')::INTERVAL + INTERVAL '1 day';

这个写法会自动计算当前日期到本周日的天数,往前推到周起始,往后推到周结束。

二、筛选指定年份的特定周数的数据

这里我们可以利用PostgreSQL的日期格式化函数,先定位到目标周的起始日期,再做范围筛选:

SELECT *
FROM your_table
WHERE datecolumn >= to_date('2020-15', 'IYYY-IW') - INTERVAL '1 day'
  AND datecolumn < to_date('2020-15', 'IYYY-IW') + INTERVAL '7 days';

代码解释:

  • to_date('YYYY-WW', 'IYYY-IW')是ISO周标准的写法:IYYY代表ISO年份,IW代表ISO周数,这个函数会返回目标周周一的零点,减1天就得到我们需要的周日起始点。
  • 同样用< 下周日零点来包含整周的所有数据。

注意:ISO周的规则是每周从周一开始,一年的第一周必须包含当年的1月4日(至少4天在当年)。如果你的业务周定义不是ISO标准,可能需要调整起始日期的计算逻辑,但ISO周是最通用的标准周定义。

内容的提问来源于stack exchange,提问作者misterxis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:42:44