【问题标题】:How to get a week number for last N days in PostgreSQL?如何在 PostgreSQL 中获取最后 N 天的周数?
【发布时间】:2019-02-07 11:00:25
【问题描述】:

我有一个包含created 日期字段的项目表。我想查看过去 N 周的订单,并运行一个 SELECT 查询,它可以告诉我该商品是在哪一周创建的。

例如:

SELECT *,
WEEK_START(created) as week_beginning,
WEEK_NUMBER(created) as week_number
FROM items
WHERE created > current_date - N * 7  ## look at last N weeks only

我希望有相同的列,但现在,另外,我将有一个 week_number 和 week_beginning 列,范围从 1 到 N,其中 N 是上周,week_beginning 会告诉我一周的开始时间。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以使用 extract(isodow FROM <date>) 从 date 中提取工作日作为数字 - 从星期一的 1 到星期日的 7。如果你从date 中减去一个小于该天数的天数,那么你就有了date 所在的一周的星期一。你有一周的开始,可以通过减去第一个之间的差来计算你的周数一周中的几天并将其除以 7。(您也可以使用 extract(week FROM <date>) 来获取周数并从那里进行计算,但这在年份之间会更加复杂,特别是如果“闰周”也发挥作用。 )

    SELECT *,
           ((current_date - (extract(isodow FROM current_date) - 1 || ' day')::interval)::date
             - (created - (extract(isodow FROM created) - 1 || ' day')::interval)::date)
           / 7 + 1 week_number,
           (created - (extract(isodow FROM created) - 1 || ' day')::interval)::date first_day_of_week
           FROM items
           WHERE created > current_date - (extract(isodow FROM current_date) + 7 * (2 - 1) || 'day')::interval
           ORDER BY created;
    

    db<>fiddle

    我更改了WHERE 子句,因此结果会被捕捉到一整周,而不是仅仅 7 天的倍数。如果您不想这样,请将其替换为旧的 WHERE 子句。如果您想保留我的WHERE 子句,您可能需要将(N - 1) 更改为仅N,如果当前周不计算在内。在这种情况下,您可能还想从周数的计算中删除 + 1,以便当前周获得数字 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2011-11-17
      相关资源
      最近更新 更多