首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按周过滤查询

按周过滤查询
EN

Stack Overflow用户
提问于 2020-01-19 23:32:27
回答 3查看 1.2K关注 0票数 1

如何在Postgresql中查询(SELECT),使日期不同的列的结果在当前周的周日到周六之间。

查询伪例:

代码语言:javascript
运行
复制
SELECT * FROM table WHERE datecolumn BETWEEN CURRENT WEEK

在另一个查询中,我得到了一年中的第几周。如何选择这些日期,并在WHERE子句中应用特定年份中的特定周数。

查询伪例:

代码语言:javascript
运行
复制
SELECT * FROM table WHERE datecolumn BETWEEN WEEK15 FROM year 2020
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-19 23:45:14

也许你可以使用这样的东西:

代码语言:javascript
运行
复制
SELECT * 
  FROM table 
  WHERE 
    EXTRACT(week FROM datecolumn) = EXTRACT(week FROM NOW())
    AND
    EXTRACT(isoyear FROM datecolumn) = EXTRACT(isoyear FROM NOW())

week是ISO-8601周数。根据定义,ISO周从星期一开始,一年的第一周包含该年的1月4日。换句话说,一年的第一个星期四在那一年的第一周。

在ISO周编号系统中,1月初的日期可以是前一年的52周或53周的一部分,而12月下旬的日期可以是下一年的第一周的一部分。

例如,2005-01-01是2004年53周的一部分,2006-01-01是2005年52周的一部分,而2012-12-31是2013年第一周的一部分。

为了获得一致的结果,建议将isoyear字段与week字段一起使用。

如果您需要自定义(非ISO)周编号-您将不得不手工计算。

票数 1
EN

Stack Overflow用户

发布于 2020-01-19 23:56:19

我会推荐以下两个条件:

代码语言:javascript
运行
复制
where 
    date_column >= current_date - extract(dow from current_date) * interval '1 day'
    and date_column < current_date - (extract(dow from current_date) - 8) * interval '1 day'

Postgres的date_trunc(week, ...)在周一开始,所以我们需要一些更复杂的东西,使用extract(dow from ...),它在周日返回0

这种方法的优点是它是SARGeable的,因为没有函数应用于被过滤的列。这意味着这将很好地利用date列上的索引。

票数 1
EN

Stack Overflow用户

发布于 2020-01-19 23:59:10

我会使用date_trunc(),但就像这样。对于当前一周:

代码语言:javascript
运行
复制
where datecolumn >= date_trunc('week', now()) and
      datecolumn < date_trunc('week', now()) + interval '1 week'

对于一年中的第n周,这就更棘手了。我认为这就是你想要的:

代码语言:javascript
运行
复制
where datecolumn >= (date_trunc('week', now()) -
                     (extract(week from now()) - 1) * interval '1 week' +
                     <n> * interval '1 week'
                    ) and
      datecolumn < (date_trunc('week', now()) -
                     (extract(week from now()) - 1) * interval '1 week' +
                     (<n> + 1) * interval '1 week'
                    )

这两种方法都是结构化的,因此计算不在列上,因此它们与使用索引兼容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59811558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档