Выбрать на основе следующего рабочего дня в таблице календаря

У меня уже заполнена календарная таблица (Calendar_Date, Is_Business_Day).

Мне уже удалось сделать SELECT на этой основе:

  • Если сегодня перед, 3-й день текущего месяца, выберите все дни до этого дня до последнего дня предпоследнего месяца.

Например : Сегодня 2018-05-02, это мой результат:

Calendar_Date |  Is_Business_Day
  2000-01-01  |    0
  ...         |
  2018-03-29  |    1
  2018-03-30  |    1
  2018-03-31  |    0
  • Если сегодня после, третий день текущего месяца, выберите все дни до этого дня до последнего дня последнего месяца.

Например : Завтра, 2018-05-03 это будет мой результат:

Calendar_Date | Is_Business_Day
  2000-01-01  |   0
  ...         |  
  2018-04-28  |   0
  2018-04-29  |   0
  2018-04-30  |   1

Это мой запрос:

SELECT        Calendar_Date, Is_Business_Day
FROM            Calendar_Table
WHERE        (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3 THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE())) ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))

Это работает отлично, но сейчас я бы хотел, чтобы он переключался после первый рабочий день после 3-го дня месяца, вместо переключения после 3-го дня месяца.

Как я могу использовать для этого информацию о рабочих днях в моем календаре?

Разве добавление AND Is_Business_Day = 1 к пункту WHERE этого не делает? Ваш вопрос неясен, потому что вы спрашиваете о «переключении», не объясняя нигде в своем вопросе, который вы имеете в виду под «переключением».

Tab Alleman 02.05.2018 15:18

Когда я добавляю AND Is_Business_Day = 1, я получаю только рабочие дни в моем выборе, но я также хотел бы, чтобы не были рабочие дни.

Swapper 02.05.2018 15:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что следующий запрос должен работать.

   ;WITH CTE AS
    (
        SELECT        Calendar_Date, Is_Business_Day
        FROM          Calendar_Table
        WHERE        (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3 
                                          THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE())) 
                                  ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))
    )
    SELECT * FROM CTE
    WHERE Calendar_Date >= (SELECT MIN(Calendar_Date) FROM CTE WHERE Is_Business_Day=1)

довольно чисто! +1

DhruvJoshi 02.05.2018 15:35

Другие вопросы по теме