如何在PostgreSQL中获得最近N天的星期数?

时间:2018-09-01 20:26:55

标签: sql postgresql

我有一个项目表,其中包含一个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会告诉我时间这个星期开始了。

1 个答案:

答案 0 :(得分:1)

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

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。