LINUX.ORG.RU

Как получить записи по диапазону дат, если есть только начало и конец?

 ,


0

2

Есть таблица с номерами

+-----+--------+
| id  | price  |
+-----+--------+
| 1   | 500    |
| 2   | 500    |
| 3   | 700    |
| 4   | 1000   |
+-----+--------+

и таблица с забронированными номерами

+-----+---------+----------+-------------+-------------+----------+--------+
| id  | person  | room_id  | start       | end         | s_time  | e_time  | 
+-----+---------+----------+-------------+-------------+---------+---------+
| 1   | Ivan    | 1        | 2022-03-01  | 2022-03-04  | 1       | 1       |
| 2   | Eva     | 1        | 2022-03-05  | 2022-03-06  | 1       | 0       |
| 3   | Maria   | 2        | 2022-03-01  | 2022-03-04  | 1       | 0       |
| 4   | Peter   | 3        | 2022-03-01  | 2022-03-02  | 1       | 0       |
| 5   | Max     | 3        | 2022-03-06  | 2022-03-07  | 1       | 1       |  
| 6   | Bob     | 4        | 2022-03-06  | 2022-03-07  | 0       | 0       | 
+-----+---------+----------+-------------+-------------+----------+--------+

s_time и e_time - это время заезда и выезда, где 0 - это до полудня, а 1 - после полудня. К примеру в записи id=5 стоит s_time 1 и e_time 1, значит заезд после полудня и выезд после полудня.

Мне нужно узнать, какие номера свободны с 4 по 6 число с заездом после полудня и выездом до полудня. Для этого я хочу получить в начале все номера, которые заняты в этот промежуток, а затем получить все номера, кроме тех, что заняты.

По факту id с занятыми номерами с 4 по 6 число - это id1, id2 и id6, потому что в id1 выезд ПП, в id2 пятого числа занято, а в id6 заезд ДП.

Подскажите пожалуйста, как получить эти id?

Показывай пример SQL-запроса, который ты пробовал, будем разбираться где ты ошибся. Просто так лабораторки за тебя делать - это фу.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Отсекаешь сначала даты, которые больше.
Потом от оставшейся части отсекаешь даты, которые меньше.
Получаешь диапазон.
PROFIT

IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)

Нахрена нам специалисты, ищущие решения задач на ЛОРе?
Я за бан!

Minona ★★☆
()

Подскажите пожалуйста, как получить эти id?

not (a < end and b > start)

По факту id с занятыми номерами с 4 по 6 число - это id1, id2 и id6, потому что в id1 выезд ПП, в id2 пятого числа занято, а в id6 заезд ДП.
s_time, e_time

Убери это позорище, сделай нормальное время с датой и всё будет решаться одним условием без плясок.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Убери это позорище, сделай нормальное время с датой и всё будет решаться одним условием без плясок.

+100500. Наплодил сущностей.

ashot ★★★★
()

Для этого я хочу получить в начале все номера, которые заняты в этот промежуток, а затем получить все номера, кроме тех, что заняты.

Ну да, всё правильно. Как это реализовать — смотри в сторону вложенного через NOT EXISTS подзапроса. Детали продумай сам.

hobbit ★★★★★
()
Ответ на: комментарий от crutch_master

Убери это позорище, сделай нормальное время с датой и всё будет решаться одним условием без плясок.

Может, структура таблиц ему уже дана в задании? И такой вариант, хоть с точки зрения SQL и «позорище», но с точки зрения логики бронирования — вполне логичен, точное время заезда никто обычно назвать не может, главное, будет ли «ранний заезд» (ДП то самое).

hobbit ★★★★★
()

mysql

SELECT 
	*
	/* или DISTINCT room_id если нужны именно комнаты, а не люди в комнатах */
FROM
	tab1 t
WHERE
	/* или выехали до 4 12:00 - */
	CONCAT(CAST(t.`end` AS char), CAST(t.e_time AS char)) < '2022-03-041'
	OR
	/* или заехали после 6 12:00 + */
	CONCAT(CAST(t.`start` AS char), CAST(t.s_time AS char)) > '2022-03-060'
Toxo2 ★★★★
()
Ответ на: комментарий от hobbit

Не логичен. Нужна тебе дата до обеда/после обеда - делай это условной датой. Лишнюю сущность с нагромождением костылей для этого делать не нужно. Ну если хочется, пусть добавляет n часов в зависимости от признака. Кроме проблем от таких псевдосущностей в процессе работы ничего не будет.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от hobbit

Ну да. Можно же еще и дату разделить на 3 поля и вздрочнуть в присядку, но зачем?

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.