加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:54:48 所属栏目:百科 来源:网络整理
导读:我知道为了提取给定年份的一周你可以使用: SELECT EXTRACT(WEEK FROM TIMESTAMP '2014-02-16 20:38:40'); 但是,我试图以一种奇怪的格式将周数组合在一起.我的一周开始将在星期一凌晨4点开始,并将在下周一凌晨3:59:59结束. 理想情况下,我想创建一个提供开始
我知道为了提取给定年份的一周你可以使用:

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

解决方法

这是为标题中要求的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周的早期边界.
>要生成所需的显示,只需将4小时添加回截断的时间戳.

> PostgreSQL Error on Heroku with “BETWEEN”

>但是对未修改的时间戳应用WHERE条件.此外,永远不要将BETWEEN用于带有小数位的时间戳.使用上面提到的WHERE条件.相比:
>使用数据类型时间戳操作,即根据当前时区使用(移位)“周”.其他考虑因素适用于时间戳.更多:

> Ignoring timezones altogether in Rails and PostgreSQL

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读