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

dil*_*ent 28 sql postgresql timestamp

我正在使用PostgreSQL 8.3.我有这样一张桌子:

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
Run Code Online (Sandbox Code Playgroud)

regist_time的数据类型是timestamp.

我需要找到一周的时间间隔(从开始到结束)和总和(结果)为num.

我想得到的结果如下:

      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
Run Code Online (Sandbox Code Playgroud)

我可以在今年获得周数:

SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba
Run Code Online (Sandbox Code Playgroud)

关键部分是

EXTRACT(WEEK FROM regis_time) 
Run Code Online (Sandbox Code Playgroud)

提取功能只能获得今年的周数,如何在一周内获得开始时间到结束时间?

Bru*_*uno 63

你可以用date_trunc('week', ...).

例如:

SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00
Run Code Online (Sandbox Code Playgroud)

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

要获得结束日期:

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
Run Code Online (Sandbox Code Playgroud)

(我在这里使用了默认格式,你当然可以调整它来使用MM/DD/YYYY.)

请注意,如果要对时间戳进行比较而不是使用(date_trunc('week', ...) + '6 days'::interval,则可能需要添加整周,并在一周结束时使用严格比较.

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

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date
Run Code Online (Sandbox Code Playgroud)

这将包括他们:

    date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)
Run Code Online (Sandbox Code Playgroud)

(这是在当你无法使用罕见的情况下date_truncy直接.)


如果您的星期在星期日开始,则替换date_trunc('week', x)::datedate_trunc('week', x + '1 day'::interval)::date - '1 day'::interval应该工作.

  • 这假设每周从星期一开始。有没有办法做同样的事情,但几周从周日开始? (2认同)

Adr*_*iro 15

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)
Run Code Online (Sandbox Code Playgroud)

请参阅SQLFiddle的概念证明:http://sqlfiddle.com/#!1/9e821/1


Ahm*_*OUR 5

这可以帮助查询获取当前一周的所有天。

select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i
Run Code Online (Sandbox Code Playgroud)

2015-08-17
2015-08-18
2015-08-19
2015-08-20
2015-08-21

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

select cast(date_trunc('week', current_date) as date) + 0 || '-->' ||  cast(date_trunc('week', current_date) as date) + 4;
Run Code Online (Sandbox Code Playgroud)

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