Рассчитать номера недель на основе начальной заданной даты до конечной даты - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть сценарий ниже, что Business хочет рассчитать номер недели на основе заданной даты начала до даты окончания.

Например: дата начала = 24.08.2020, дата окончания = 31.12.2020 (эти Дата начала и дата окончания не являются постоянными, они могут изменяться из года в год)

Ожидаемый результат ниже:

[Date 1      Date 2       Week Number
8/24/2020    8/30/2020    week1
8/31/2020    9/6/2020     week2
9/7/2020     9/14/2020    week3
9/15/2020    9/21/2020    week4
9/22/2020    9/28/2020    week5
9/29/2020    10/5/2020    week6
10/6/2020    10/12/2020   week7
10/13/2020   10/19/2020   week8
10/20/2020   10/26/2020   week9
10/27/2020   11/02/2020   week10
11/03/2020   11/09/2020   week11
11/10/2020   11/16/2020   week12
11/17/2020   11/23/2020   week13
11/24/2020   11/30/2020   week14

Мне нужно Oracle Запрос для вычисления номера недели, как указано выше .. Исходя из даты начала в течение 7 дней, будет вычислен номер недели. Но помните, что месяцы пересечения в каком-то месяце имеют 30 дней, а в каком-то месяце 31 день и т. Д. c .. Как рассчитать? Ценю вашу помощь !!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Похоже, вы ищете пользовательское определение недели, а не встроенные модули. Но не слишком сложно. Первым делом нужно преобразовать строки в даты (если столбцы действительно выходят из таблицы, это преобразование не требуется), и оттуда Oracle выполняет все вычисления, поскольку вы можете применять арифметические операции c к датам, кроме добавления 2. даты. Oracle автоматически обрабатывает различное количество дней в месяце правильно. Два метода для этого запроса:

  1. Использовать рекурсивный CTE (с)
with dates(start_date,end_date) as 
     ( select date '2020-08-24' start_date
            , date '2020-12-31' end_date 
         from dual
     )
   , weeks (wk, wk_start, wk_end, e_date) as
     ( select 1, start_date, start_date+6 ld, end_date from dates
       union all 
       select wk+1, wk_end+1, wk_end+7, e_date
         from weeks 
        where wk_end<e_date
     )
select wk, wk_start, wk_end from weeks;
Используйте Oracle, подключитесь
with dates(start_date,end_date) as 
     ( select date '2020-08-24' start_date
            , date '2020-12-31' end_date 
         from dual
     )
 select level wk
      , start_date+7*(level-1) wk_start
      , start_date+6+7*(level-1)
   from dates
 connect by level <= ceil( (end_date-start_date)/7.0);

Зависит от того, насколько строго вы должны быть с указанной датой окончания, вам может потребоваться скорректировать последнюю возвращенную строку. Оба запроса не делают поправку на это. Они просто гарантируют, что после этой даты не начинается неделя. Но последняя неделя содержит полные 7 дней, которые могут закончиться после указанной даты окончания.

0 голосов
/ 23 апреля 2020

Если ваш тип данных даты varchar, то сначала преобразуйте его в дату, а затем преобразуйте обратно в varchar.

convert date to to_char(to_date('8/24/2020','MM/DD/YYYY'),'WW')

Если вы сохраните тип данных недели как number, тогда вы можете сделать что-то вроде этого

to_number(to_char(to_date('8/24/2020','MM/DD/YYYY'),'WW'))

Несколько вариантов в соответствии с вашими потребностями.

WW  Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
W   Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IW  Week of year (1-52 or 1-53) based on the ISO standard.
...