Как распечатать все понедельники месяца май-2020 - PullRequest
0 голосов
/ 27 мая 2020
Select next_day(to_date('01-may-20','dd-mon-yy')-1,'monday')+7*(level-1)
from dual 
connect by level<=4;

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Вы можете использовать рекурсивный подход, если хотите просто посмотреть на конкретный c месяц:

with cte as (
     select convert(date, '2020-05-01') as startdate
     union all
     select dateadd(day, 1, startdate)
     from cte c
     where c.startdate < '2020-05-31'
)
select c.startdate as Mondays
from cte c
where (datepart(WEEKDAY, c.startdate) + 5) % 7 + 1  = 1;
0 голосов
/ 27 мая 2020

Используйте запрос ниже:

Select to_date('01-MAY-2020', 'DD-MON-YYYY') + (level-1)
from dual 
where ltrim(rtrim(to_char(to_date('01-MAY-2020', 'DD-MON-YYYY') + (level-1), 'Day'))) = 
'Monday'
connect by level<=31;
  1. Дата взята как '01 -MAY-2020 ', как вы просили
  2. В предложении WHERE дата преобразуется в день и отфильтровано только для понедельника
0 голосов
/ 27 мая 2020

Этот запрос вернет все понедельники месяца, начиная с переменной @day.

declare @day date = '2020-05-01';

with cte as (
  select @day as day
  union all
  select dateadd(day, 1, day) 
  from cte
  where month(dateadd(day, 1, day)) = month(day)
)
select * 
from cte 
where datepart(weekday, day) = 2

Он рекурсивный, вы начинаете с переменной @day и добавляете один день подряд, пока вы остаетесь на в том же месяце. Как только этот CTE возвращает все дни месяца, вы фильтруете его, возвращая дни дня недели 2 (эта функция запускает неделю в воскресенье как день 1).

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