Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите написать SQL запрос.

forcetime Профи (516), на голосовании 3 года назад
Имеется следующая таблица. И мне нужен запрос, который показывает аудитории, которые свободны. То есть аудитории, где нет занятий в эту дату и в эту пару ( 1 пару, 2 пара и тд).

Набросал следующее, но чёт фигня какая-то со сравнением даты. Тоесть в SQL servere дата хранится в виде 2020-12-18. А вводится для сравнения из приложения в виде 18.12.2020
SELECT [id_office],
concat('Корпуc:', korpus, ' Аудитория:',number) as AUDIT
FROM [office]
where not exists(select id_raspisanie,convert(varchar (10), date, 104) as [Дата] from raspisanie
where raspisanie.[Дата] ='18.12.2020' and id_office=1)
Голосование за лучший ответ
Ярослав Мастер (1827) 3 года назад
я пишу на MySQL, но, думаю, что конструкция выйдет +- универсальной

не уверен, что таблица para вообще нужна, так как она, по сути, не хранит ничего полезного и всё это можно было бы запихать в таблицу расписание, в start_time и end_time хранить при этом дату и время в формате 2021-05-02 20:18:47, а от столбца date в ней избавиться, так как дату при желании можно получить функцией date(start_time)

итого с указанными корректировками имеем:
SELECT a.* FROM office AS a
LEFT JOIN raspisanie AS b ON a.id_office = b.id_office
WHERE CONCAT_WS('.',DATE_FORMAT(b.start_time, "%d"),DATE_FORMAT(b.start_time, "%m"),DATE_FORMAT(b.start_time, "%Y")) = '02.05.2021'
AND b.id_office IS NULL

на IS NULL некоторые интерпретаторы могут жаловаться, но простите, пишу как умею. если есть какой-то более конкретный пример с данными таблиц - был бы рад увидеть и дописать до полностью рабочего варианта

P.S: да и нужно ли хранить end_time вообще, если это start_time +INTERVAL 90 MINUTE...
forcetimeПрофи (516) 3 года назад
Спасибо, за помощь
forcetimeПрофи (516) 3 года назад
Это снова я. Короче я решил не мучиться с датами и просто убрал их из бд. Таблицу ПАРА я оставил, так как проще работать с интовским числом, а не перебирать их по времени. И заменил дату на день недели в виде int значения в виде id. И я теперь хочу получить список аудиторий, которые не заняты в определенную пару и в определенный день недели. Но нифига не получается. Помоги пожалуйста. Вот как пытался сделать. Но не работает
SELECT [office].[id_office],
concat('Корпуc:', korpus, ' Аудитория:',NUMBER) AS AUDIT
FROM [office]
where exists (select id_office from raspisanie
WHERE id_para = 1 AND id_day = 1
)
Ярослав Мастер (1827) Fury, в таком режиме довольно затруднительно становится определить, за какую именно неделю нас интересует информация. предыдущие записи будут удаляться? существование разных расписаний на текущую и следующую неделю резко усложнит задачу при отсутствии даты
ЯрославМастер (1827) 3 года назад
у меня выполняется корректно:

SELECT `id_office`,
CONCAT('Корпус: ', `korpus`, ', Аудитория: ', `number`) AS AUDIT
FROM `office`
WHERE `id_office` NOT IN (
SELECT `id_office` FROM `raspisanie`
WHERE `id_para` = 1 AND `id_day` = 1)

остаётся только синтаксис под SQL подправить, но логика должна сохраниться. пример созданных таблиц на скриншоте
ЯрославМастер (1827) 3 года назад
результат выполнения:
Похожие вопросы