首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PostgreSQL中获取周的开始和结束日期字符串?

如何在PostgreSQL中获取周的开始和结束日期字符串?
EN

Stack Overflow用户
提问于 2012-08-01 22:55:44
回答 5查看 67.9K关注 0票数 42

我使用的是PostgreSQL 8.3。我有一张这样的桌子:

代码语言:javascript
复制
id        regist_time        result
-----------------------------------
1     2012-07-09 15:00:08      3
2     2012-07-25 22:24:22      7
4     2012-07-07 22:24:22      8

regist_time的数据类型是timestamp

我需要找到一个星期的时间间隔(开始到结束)和sum(结果)作为num。

我想要得到的结果如下:

代码语言:javascript
复制
      week                    num    
---------------------------------
7/1/2012-7/7/2012              10
7/8/2012-7/14/2012              5
7/15/2012-7/21/2012             3
7/22/2012-7/28/2012            11

我可以得到这一年的周数:

代码语言:javascript
复制
SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba

关键部分是

代码语言:javascript
复制
EXTRACT(WEEK FROM regis_time) 

提取函数只能获取本年度的周数,如何获取一周内的开始时间到结束时间?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-01 23:02:35

您可以使用date_trunc('week', ...)

例如:

代码语言:javascript
复制
SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00

然后,如果您对开始时间不感兴趣,可以将其转换为日期。

要获得结束日期,请执行以下操作:

代码语言:javascript
复制
SELECT    date_trunc('week', '2012-07-25 22:24:22'::timestamp)::date
   || ' '
   || (date_trunc('week', '2012-07-25 22:24:22'::timestamp)+ '6 days'::interval)::date;

-> 2012-07-23 2012-07-29

(我在这里使用了默认格式,您当然可以将其修改为使用MM/DD/YYYY。)

请注意,如果您想要对时间戳进行比较,而不是使用(date_trunc('week', ...) + '6 days'::interval,您可能希望添加整个星期,并对这周的最后一周使用严格的比较。

这将排除一周最后一天的y时间戳(因为截止时间是当天的午夜)。

代码语言:javascript
复制
    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date

这将包括它们:

代码语言:javascript
复制
    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)

(在极少数情况下,您不能直接在y上使用date_trunc。)

如果你的一周从星期天开始,用date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval替换date_trunc('week', x)::date应该是可行的。

票数 94
EN

Stack Overflow用户

发布于 2012-08-01 23:09:35

代码语言:javascript
复制
select date_trunc('week', regist_time)::date || ' - ' ||
       (date_trunc('week', regist_time) + '6 days') ::date as Week,
       sum(result) Total
from YourTable
group by date_trunc('week', regist_time)
order by date_trunc('week', regist_time)

请访问SQLFiddle:http://sqlfiddle.com/#!1/9e821/1查看概念验证

票数 18
EN

Stack Overflow用户

发布于 2015-08-18 18:52:26

这可能会有所帮助,查询以获取当前周的所有日期。

代码语言:javascript
复制
select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i

2015-08-17

2015-08-18

2015-08-19

2015-08-20

2015-08-21

要获取周的开始日期和结束日期(如0表示星期一,4表示星期五):

代码语言:javascript
复制
select cast(date_trunc('week', current_date) as date) + 0 || '-->' ||  cast(date_trunc('week', current_date) as date) + 4;

2015-08-17-->2015-08-21

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11761938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档