我正在使用 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
regist_time
的数据类型为timestamp
。
我需要找一周的时间间隔(从头到尾) 和sum(结果)为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
我可以在今年获得周数:
SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek
FROM tba
关键部分是
EXTRACT(WEEK FROM regis_time)
提取功能只能获得今年的周数,如何在一周内获得开始时间到结束时间?
答案 0 :(得分:58)
您可以使用date_trunc('week', ...)
。
例如:
SELECT date_trunc('week', '2012-07-25 22:24:22'::timestamp);
-> 2012-07-23 00:00:00
然后,如果您对开始时间不感兴趣,可以将其转换为日期。
要获得结束日期:
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
个时间戳(因为截止时间是当天的午夜)。
date_trunc('week', x)::date <= y::timestamp
AND y::timestamp <= (date_trunc('week', x) + '6 days'::interval)::date
这将包括他们:
date_trunc('week', x)::date <= y::timestamp
AND y::timestamp < (date_trunc('week', x) + '1 week'::interval)
(在极少数情况下,您无法直接在date_trunc
上使用y
。)
如果您的星期在星期日开始,则将date_trunc('week', x)::date
替换为date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval
应该有效。
答案 1 :(得分:14)
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
答案 2 :(得分:3)
是
select to_date('2015-07', 'IYYY-IW');
在postgres中使用它
它会返回
2015-02-09
答案 3 :(得分:2)
这可以提供帮助,查询可以获得本周的所有日子。
select cast(date_trunc('week', current_date) as date) + i
from generate_series(0,6) i
2015年8月17日
2015年8月18日
2015年8月19日
二零一五年八月二十日
2015年8月21日
获取周开始日期和结束日期(周一为0,周五为4):
select cast(date_trunc('week', current_date) as date) + 0 || '-->' || cast(date_trunc('week', current_date) as date) + 4;
2015年8月17日 - &GT; 2015年8月21日