SELECT date '2016-01-01' + interval '1 day' * ((7 - EXTRACT(DOW FROM DATE '2016-01-01')) + 29*7) AS start_date,
date '2016-01-01' + interval '1 day' * ((7 - EXTRACT(DOW FROM DATE '2016-01-01')) + 29*7 + 6) AS end_date,
create or replace function first_date_of_isoweek(y int, w int)
returns date
language sql as $$
select to_date(concat(y, to_char(w, 'fm00')), 'iyyyiw');
$$;
create or replace function last_date_of_isoweek(y int, w int)
returns date
language plpgsql as $$
declare
d1 date;
d2 date;
d smallint;
begin
-- Calculate first date of an isoweek
d1 = to_date(concat(y, to_char(w, 'fm00')), 'iyyyiw');
-- Year's last week needs an speacial treatment
if w = 52 then
return to_date(concat(y, '1231'), 'yyyyMMdd');
else
-- Calculate the dow of the first date
d = extract(isodow from d1);
-- Calculate the last date out of the first date
return d1 + interval '1 day' * (7-d);
end if;
end $$;
3条答案
按热度按时间fwzugrvs1#
要获取开始日期,只需使用
to_date()
将周数转换为日期如果使用ISO周数,用途:
否则用途:
只需将结果日期加上6天即可获得一周的结束日期:
to_date('201643', 'iyyyiw') + 6
zaqlnxep2#
6tr1vspr3#
如果你允许一年中的第一周和最后一周少于7天,那么处理周可能会很棘手。
这是我使用ISO周的两分钱(第一天是星期一,道琼斯指数= 1)。它们返回一年中某周的第一个和最后一个日期以及周索引。
请注意,一年有365/7 = 52,142857142857143周,或366/7 = 52,285714285714286周,这取决于它的长度。所以,周的范围总是在[0,52]。第52周我不得不使用
if
,因为它不能计算为7-d
。测试2021如下: