2016-02-23 1 views
1

Я пытаюсь получить номера недель между двумя датами.Номера недель между двумя датами

Например, между датами 01/01/2016 и 29/02/2016 я должен

S01 S02 S03 S04 S05 S06 S07 S08 

Возможно ли это? Как это можно сделать?

+1

У вас есть таблица, содержащая все даты? – sagi

+1

Каковы номера недель; календарных недель? Ионные номера ISO в течение года? Что представляет собой S? Вы хотите полные недели в диапазоне или в какие-то частичные недели? –

ответ

3
SELECT 'S' || LPAD(LEVEL, 2, '0') 
FROM DUAL 
CONNECT BY DATE '2016-01-01' + (LEVEL - 1) * 7 <= DATE '2016-02-29'; 

Выход:

'S'||LPAD(LEVEL,2,'0') 
---------------------- 
S01      
S02      
S03      
S04      
S05      
S06      
S07      
S08      
S09 

Update - с месяца & датами:

Примечание: изменены границы, чтобы подчеркнуть разницу между номером недели и порядковый номер.

WITH bounds AS (
    SELECT DATE '2016-03-01' AS lower_bound, 
     DATE '2016-04-30' AS upper_bound 
    FROM DUAL 
), 
weeks AS (
    SELECT LEVEL AS id, 
     lower_bound + (LEVEL - 1) * 7 AS week_date 
    FROM bounds 
    CONNECT BY lower_bound + (LEVEL - 1) * 7 <= upper_bound 
) 
SELECT 'S' || LPAD(id, 2, '0') AS id, 
     'W' || TO_CHAR(week_date, 'WW') AS week, 
     'M' || TO_CHAR(week_date, 'MM') AS month, 
     week_date 
FROM weeks; 

Выход:

ID WEEK MONTH WEEK_DATE 
--- ---- ----- --------- 
S01 W09 M03 01-MAR-16 
S02 W10 M03 08-MAR-16 
S03 W11 M03 15-MAR-16 
S04 W12 M03 22-MAR-16 
S05 W13 M03 29-MAR-16 
S06 W14 M04 05-APR-16 
S07 W15 M04 12-APR-16 
S08 W16 M04 19-APR-16 
S09 W17 M04 26-APR-16 
+0

Это ТОЧНО, что я хотел !! Спасибо, чувак: D –

+0

У вас его есть в течение нескольких месяцев? –

+0

M01, M02 вы видите? Месяцы - две даты. –

2

Если вы хотите неделю число календаря, то вы можете использовать подобный иерархический подход к ответу МТО в:

select distinct 'S' || to_char(date '2016-01-01' + level -1, 'WW') as week_num 
from dual 
connect by level <= date '2016-02-29' - date '2016-01-01' 
order by week_num; 

WEE 
--- 
S01 
S02 
S03 
S04 
S05 
S06 
S07 
S08 
S09 

Если вы хотите ISO недель затем используйте IW вместо WW, но это делает первую неделю S53 (с прошлого года).

 Смежные вопросы

  • Нет связанных вопросов^_^