我有一个项目表,其中包含一个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
会告诉我时间这个星期开始了。
答案 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;
我更改了WHERE
子句,因此结果被捕捉到整整一周的时间,而不仅仅是7天的倍数。如果您不想这样做,请用旧的WHERE
子句替换它。如果您想保留我的WHERE
子句,则可能需要将(N - 1)
更改为N
(如果当前星期不计算在内)。在这种情况下,您可能还希望从星期数的计算中删除+ 1
,以便当前星期得到数字0。