Разбираемся с черезнедельными занятиями
Найдите преподавателя у которого есть день, в который бывают и черезнедельные и еженедельные занятия и сделайте микро отчет вида пример_отчета.docx
Возможно вы заметили, делая предыдущее задание, что в поле day, которое отвечает за номер дня недели, по какой-то причине встречаются значения больше 7:
Это связано с тем что в политехе основное расписание организовано в двухнедельный цикл. По регулярности проведения, занятия можно разделить следующим образом:
Четность недели определяется по 1-му сентября. Неделя, на которую приходится начало учебного года считается нечетной.
Кстати на сайте не важно какую неделю вы откроете видно расписание сразу на две недели, на текущую и на следующую:
С точки зрения таблицы schedule_items
, чтобы понять на какую неделю приходится то или иное занятие нам помимо поля day
потребуется еще одно поле, которое показывает является ли пара еженедельной.
Поле называется everyweek
, если там значение 2
то пара еженедельная, если там 1
то пара черезнедельная. Мы это разберем чуть ниже.
Давайте запросим расписание на конкретную неделю по аудитории К-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