我正在使用 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。
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
我可以得到今年的第几周:
SELECT id,regis_time, EXTRACT(WEEK FROM regis_time) AS regweek FROM tba
关键部分是
EXTRACT(WEEK FROM regis_time)
提取功能只能得到今年的星期数,我如何才能获得一周中的开始时间到结束时间?
您可以使用date_trunc('week', ...)。
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,则可能要添加整整一周,并在一周结束时使用严格的比较。
(date_trunc('week', ...) + '6 days'::interval
这将不包括y一周中最后一天的时间戳记(因为截止时间是当天的午夜)。
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
如果您的一周从星期日开始date_trunc('week', x)::date,则date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval应该用代替。
date_trunc('week', x)::date
date_trunc('week', x + '1 day'::interval)::date - '1 day'::interval