Я пытаюсь получить номера недель в году, начиная с определенного дня, я проверил стек, но довольно запутался.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2021-01-01'),
       extract('year' from TIMESTAMP '2021-01-01')

Выход 53 | 2021

Я хочу, чтобы это было 01 | 2021

Я понимаю принцип isoweek, но хочу, чтобы год начался 01-01-2021

Цель состоит в том, чтобы использовать интервалы с этого дня для определения номеров недель.

Week N0| End Date
     1 | 01-01-2021
     2 | 01-08-2021
     5 | 01-29-2021
...
0
xmiha 17 Ноя 2021 в 22:36
Видимо вы упускаете суть недели ISO. Неделя ISO всегда начинается в понедельник, но вы хотите начать в пятницу - этого не происходит. Кроме того, первая неделя года по ISO - понедельник 4 января или ранее. Это иногда приводит к неожиданным результатам, так как дни начала января могут приходиться на последнюю неделю предыдущего календарного года, или последние дни - декабрь первой календарной недели следующего календарного года.
 – 
Belayer
18 Ноя 2021 в 03:46
Выражение extract( 'week' from somedate) возвращает номер недели по ISO, для согласованности вам потребуется extract('isoweek' from somedate). Итак, для ваших данных: выберите экстракт («неделя» с даты «2021-01-01»), экстракт («годичный год» с даты «2021-01-01»); Как указывает @a_horse_with_no_name для определения любой другой недели, вам необходимо ее вычислить.
 – 
Belayer
18 Ноя 2021 в 03:54

1 ответ

Лучший ответ

Это действительно странный способ определения номера недели, но, в конце концов, это простая математическая операция: количество дней с первого января, разделенное на 7.

Вы можете создать для этого функцию:

create function custom_week(p_input date)
  returns int
as
$$
   select (p_input - date_trunc('year', p_input)::date) / 7 + 1;
$$
language sql
immutable;

Итак, это:

select date, custom_week(date)
from (
  values 
    (date '2021-01-01'), 
    (date '2021-01-08'), 
    (date '2021-01-29')
) as v(date)

Дает

date       | custom_week
-----------+------------
2021-01-01 |           1
2021-01-08 |           2
2021-01-29 |           5
0
a_horse_with_no_name 17 Ноя 2021 в 23:48