我知道为了提取某一年的一周你可以使用:
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
答案 0 :(得分:3)
这是标题中要求的 Postgres 。
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;
完全生成所需的输出 。
SQL Fiddle(用实际显示差异的行扩展)。
date_trunc()
是这里的优秀工具。您对周数不感兴趣,但在实际时间戳中。
诀窍是在提取周之前从选定的时间戳中减去 4小时 - 从而将时间范围转移到ISO周的早期边界。 / p>
要生成所需的显示,只需将4小时添加回截断的时间戳。
但是对未修改的时间戳应用WHERE
条件。此外,从不使用BETWEEN
时间戳,其中包含小数位数。使用上述WHERE
条件。比较:
使用数据类型timestamp
进行操作,即根据当前时区使用(移位)“周”。其他注意事项适用于timestamptz
。更多: