如何在postgresql中从周数获取周开始日期?

xurqigkl  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(837)

我有从20161到201640的所有周数。我想知道第31周的开始日期和结束日期是什么。
我如何在postgresql中编写查询来获得它?

fwzugrvs

fwzugrvs1#

要获取开始日期,只需使用to_date()将周数转换为日期
如果使用ISO周数,用途:

select to_date('201643', 'iyyyiw');

否则用途:

select to_date('201643', 'yyyyww');

只需将结果日期加上6天即可获得一周的结束日期:to_date('201643', 'iyyyiw') + 6

zaqlnxep

zaqlnxep2#

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,
6tr1vspr

6tr1vspr3#

如果你允许一年中的第一周和最后一周少于7天,那么处理周可能会很棘手。
这是我使用ISO周的两分钱(第一天是星期一,道琼斯指数= 1)。它们返回一年中某周的第一个和最后一个日期以及周索引。
请注意,一年有365/7 = 52,142857142857143周,或366/7 = 52,285714285714286周,这取决于它的长度。所以,周的范围总是在[0,52]。第52周我不得不使用if,因为它不能计算为7-d

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 $$;

测试2021如下:

select first_date_of_isoweek(2021, 0);

first_date_of_isoweek|
---------------------+
           2021-01-01|

select last_date_of_isoweek(2021, 0);

last_date_of_isoweek|
--------------------+
          2021-01-03|

select first_date_of_isoweek(2021, 1);

first_date_of_isoweek|
---------------------+
           2021-01-04|

select last_date_of_isoweek(2021, 1);

last_date_of_isoweek|
--------------------+
          2021-01-10|

select first_date_of_isoweek(2021, 52);

first_date_of_isoweek|
---------------------+
           2021-12-27|

select last_date_of_isoweek(2021, 52);

last_date_of_isoweek|
--------------------+
          2021-12-31|

相关问题