你能在 PostgreSQL 中定义自定义“周”吗?

问题描述 投票:0回答:1

要提取给定年份的星期,我们可以使用:

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
sql postgresql timestamp date-arithmetic
1个回答
7
投票

产生您想要的输出:

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;

fiddle - 扩展一行,带来不同
sqlfiddle

说明

date_trunc()
是这里的高级工具。您对周数不感兴趣,而是对实际时间戳感兴趣。

“技巧”是在提取周之前从所选时间戳中减去 4 小时 - 从而将时间范围移向 ISO 周的较早范围。要产生所需的显示,请将相同的 4 小时添加回截断的时间戳。

但对未修改的时间戳应用

WHERE
条件。另外,never
BETWEEN
与带有小数位的时间戳一起使用。使用如上所述的
WHERE
条件。参见:

使用数据类型

timestamp
进行操作,即根据当前时区(移动)“周”。您可能想使用
timestamptz
来代替。参见:

© www.soinside.com 2019 - 2024. All rights reserved.