Как мне сгенерировать все даты воскресенья между 2 датами в oracle sql? - PullRequest
0 голосов
/ 18 ноября 2018

Как мне сгенерировать все даты Воскресенье между 2 датами в Oracle SQL?

Пример, если я хочу, чтобы все воскресенья между "01/10/2018" и "31/12/2018" вывод

will be:
07/10/2018
14/10/2018
21/10/2018
...
30/12/2018

Кроме того, как мне сгенерировать все даты между двумя датами?

Пример: с "01/12/2018" до "31/12/2018"

Вывод будет:

01/12/2018
02/12/2018
03/12/2018
...
31/12/2018

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Следующий запрос делает это.

Сначала сгенерируйте строки, используя предложение connect by, каждая строка будет иметь значение столбца «level», увеличенное на 1 Также получите day_of_week за дату Отфильтруйте записи, где day_of_week = 'sun'

with data
  as (
    select to_date('1/10/2018','dd/mm/yyyy')+level as sun_day
           ,to_char(to_date('1/10/2018','dd/mm/yyyy')+level,'dy') day_of_week
      from dual
    connect by level<=to_date('31/12/2018','dd/mm/yyyy') - to_date('1/10/2018','dd/mm/yyyy')  
      )
select sun_day
  from data
where day_of_week='sun'  

Для второй части запроса просто удалите фильтр на day_of_week

with data
  as (
    select to_date('1/10/2018','dd/mm/yyyy')+level as sun_day
           ,to_char(to_date('1/10/2018','dd/mm/yyyy')+level,'dy') day_of_week
      from dual
    connect by level<=to_date('31/12/2018','dd/mm/yyyy') - to_date('1/10/2018','dd/mm/yyyy')  
      )
select sun_day
  from data;
0 голосов
/ 18 ноября 2018
select
    to_char(date,'DD-MON-YYYY')
from
    dates
where
    (trunc(date) >= '01/12/2018'
    and
        trunc(date)<= '31/12/2018')
    and
        to_char(date,'DAY') ='SUNDAY';
0 голосов
/ 18 ноября 2018

Вот как; CTE (dates) создает «календарь» всех дат, начиная с 2018-10-01, для количества дней между 2018-10-01 и 2018-12-31. Это отвечает на ваш второй вопрос.

Для первого вопроса, используя функцию TO_CHAR с соответствующей маской формата (dy) и языком дат (потому что, если бы я не использовал его, вы получили бы хорватские имена, так как это мой язык по умолчанию), выберите все воскресенья.

SQL> with dates as
  2    (select date '2018-10-01' + level - 1 datum
  3     from dual
  4     connect by level <= date '2018-12-31' - date '2018-10-01' + 1
  5    )
  6  select datum
  7  From dates
  8  where to_char(datum, 'dy', 'nls_date_language = english') = 'sun';

DATUM
-----------
07-oct-2018
14-oct-2018
21-oct-2018
28-oct-2018
04-nov-2018
11-nov-2018
18-nov-2018
25-nov-2018
02-dec-2018
09-dec-2018
16-dec-2018
23-dec-2018
30-dec-2018

13 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...