О видах цикличности занятий

Возможно вы заметили, делая предыдущее задание, что в поле day, которое отвечает за номер дня недели, по какой-то причине встречаются значения больше 7:

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

  • еженедельные занятия
  • занятия, которые проводятся только по НЕЧЕТНЫМ неделям
  • занятия, которые проводятся только по ЧЕТНЫМ неделям

Четность недели определяется по 1-му сентября. Неделя, на которую приходится начало учебного года считается нечетной.

Кстати на сайте не важно какую неделю вы откроете видно расписание сразу на две недели, на текущую и на следующую:

С точки зрения таблицы schedule_items, чтобы понять на какую неделю приходится то или иное занятие нам помимо поля day потребуется еще одно поле, которое показывает является ли пара еженедельной.

Поле называется everyweek, если там значение 2 то пара еженедельная, если там 1 то пара черезнедельная. Мы это разберем чуть ниже.

Запрашиваем расписание аудитории К-305

Давайте запросим расписание на конкретную неделю по аудитории К-305. Возьмем старое расписание чтобы не запутаться: https://www.istu.edu/schedule/?aud=404&date=2022-11-28

Соответствующий запрос будет выглядеть так:

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404 and dbeg = '2022-11-28'
ORDER BY day, para, everyweek

давайте проанализируем понедельник:

получается, что четыре занятия мы смогли сопоставить, а вот одно как будто бы отсутствует в БД.

На самом деле это не так.

Тут как раз появляется смысл в значениях day которые больше 7. Так как у нас двухнедельный цикл то в случае, когда пара черезнедельная, то она может проходить либо в понедельник на нечетной неделе, либо в понедельник на четной.

Понедельнику на нечетной недели соответствует значение day равное 1.

А вот понедельник на четной – соответствует значение day равное 8. Значение 8 получается просто путем добавления 7 к номеру понедельника (то бишь к 1).

И если проскроллить результат запроса внизу, то мы найдем там как раз эту 8

Обратите внимание на значения в поле everyweek. Я про него выше уже писал. Если там стоит 1 это значит, что пара – черезнедельная, а если там 2 – еженедельная.

Запрашиваем расписание на понедельник

Давайте теперь попробуем написать запрос который выдаст нам пары на конкретный день недели.

Для этого надо воспользоваться следующими правилами:

  • Если пара еженедельная, то everyweek имеет значение 2, а поле day принимает значения от 1 до 7 (где 1 – понедельник, 2 – вторник и т.д.)
  • Если пара проводится по нечетным неделям, то everyweek имеет значение 1, а поле day принимает значения от 1 до 7 (где 1 – понедельник, 2 – вторник и т.д.)
  • Если пара проводится по четным неделям, то everyweek имеет значение 1, а поле day принимает значения от 8 до 14 (где 8 – понедельник, 9 – вторник и т.д.)

Запросим расписание на понедельник:

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404
     and dbeg = '2022-11-28'
     and day in (1,8)
ORDER BY day, para, everyweek

Запрос на ЧЕТНЫЙ понедельник

А теперь давайте попробуем запросить данные на четную неделю. Попробуем сначала так:

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404
     and dbeg = '2022-11-28'
     and day = 8 and everyweek = 1
ORDER BY day, para, everyweek

что-то не так, почему-то всего одна пара осталась. То есть красненькую получили, а синие – нет:

А дело в том, что синие – это еженедельные занятия, а стало быть каждый раз когда мы запрашиваем расписание на четную / нечетную неделю, надо обязательно включать в запрос еще и еженедельные занятия:

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404
     and dbeg = '2022-11-28'
     and (
        (day = 8 and everyweek = 1 )
        or  (day = 1 and everyweek = 2)
     )
ORDER BY day, para, everyweek

немного страшновато выглядит, но по сути я просто добавил учет еженедельных занятий через or (day = 1 and everyweek = 2)

выдает то что надо

Запрос на НЕЧЕТНЫЙ понедельник

Попробуем теперь запрос для нечетной недели. Все тоже самое только day с 8 на 1 меняем

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404
     and dbeg = '2022-11-28'
     and (
        (day = 1 and everyweek = 1 )
        or  (day = 1 and everyweek = 2)
     )
ORDER BY day, para, everyweek

вообще если на запрос подольше посмотреть, то можно его вообще-то так написать

SELECT day, para, everyweek, groups, discipline
FROM schedule_items
WHERE auditory_id = 404
     and dbeg = '2022-11-28'
     and day = 1
ORDER BY day, para, everyweek

В принципе не сильно и страшно. Попробуйте сделать задание.

Задание

Разбираемся с черезнедельными занятиями


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