要提取给定年份的星期,我们可以使用:
SELECT EXTRACT(WEEK FROM timestamp '2014-02-16 20:38:40');
但是,我正在尝试以一种有点奇怪的格式将几周组合在一起。我的一周从每周一凌晨 4 点开始,到下周一凌晨 3:59:59 结束。
理想情况下,我想创建一个提供开始日期和结束日期的查询,然后按上面列出的周数对该期间的总销售额进行分组。
示例:
SELECT
(some custom week date),
SUM(sales)
FROM salesTable
WHERE
startDate BETWEEN 'DATE 1' AND 'DATE 2'
我不想更改
EXTRACT()
函数,而是创建一个从以下示例表中提取并输出示例结果的查询。
如果查询中的“日期 1”为“2014-07-01”且“日期 2”为“2014-08-18”:
样本表:
itemID | timeSold | price
------------------------------------
1 | 2014-08-13 09:13:00 | 12.45
2 | 2014-08-15 12:33:00 | 20.00
3 | 2014-08-05 18:33:00 | 10.00
4 | 2014-07-31 04:00:00 | 30.00
想要的结果:
weekBegin | priceTotal
----------------------------------
2014-07-28 04:00:00 | 30.00
2014-08-04 04:00:00 | 10.00
2014-08-11 04:00:00 | 32.45
产生您想要的输出:
SELECT date_trunc('week', time_sold - interval '4h')
+ interval '4h' AS week_begin
, sum(price) AS price_total
FROM tbl
WHERE time_sold >= '2014-07-01 0:0'::timestamp
AND time_sold < '2014-08-19 0:0'::timestamp -- start of next day
GROUP BY 1
ORDER BY 1;
date_trunc()
是这里的高级工具。您对周数不感兴趣,而是对实际时间戳感兴趣。
“技巧”是在提取周之前从所选时间戳中减去 4 小时 - 从而将时间范围移向 ISO 周的较早范围。要产生所需的显示,请将相同的 4 小时添加回截断的时间戳。
但对未修改的时间戳应用
WHERE
条件。另外,never将BETWEEN
与带有小数位的时间戳一起使用。使用如上所述的 WHERE
条件。参见:
使用数据类型
timestamp
进行操作,即根据当前时区(移动)“周”。您可能想使用 timestamptz
来代替。参见: