powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор свободных дат
10 сообщений из 10, страница 1 из 1
Выбор свободных дат
    #40012117
zloi_templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, есть много служебных таблиц с номерами отелей и информацией по ним
Есть задача сделать предложение клиенту по номерам
Имеется: Дата начала заезда, дата конца заезда, к примеру с 01.06.2020 по 30.12.2020

Есть таблица занятости номеров (скрин 1) (id номера, начало заезда - конец заезда, все даты, которые отсутствуют - свободные
Соответственно, на все занятые интервалы дат для выбранного номера нужно подобрать свободный номер на этот срок.

У меня из идей только делать новую таблицу, где на каждый день интервала проверять свободность для каждого номера.
Потом уже на шарпе составлять
Может быть есть варианты получше?
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012138
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloi_templar
Соответственно, на все занятые интервалы дат для выбранного номера нужно подобрать свободный номер на этот срок
"сложная" фраза

--
Создай таблицу-календарь, заполни на 100лет, и джойни к ней анти-лефт джойном свою "таблица занятости номеров"
Всё, что выдаст запрос - не занятые номера/дни
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012139
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE @t TABLE (
    [Date] date
)

INSERT @t VALUES('2/29/2020')

;WITH year([date]) AS (
    SELECT CAST('1/1/2020' AS date)
    UNION ALL
    SELECT DATEADD(d, 1, [date])
        FROM year WHERE [date] < '12/31/2020'
)
SELECT * FROM year y 
    WHERE NOT EXISTS (
        select * from @t t where t.[Date] = y.[date] 
    ) 
OPTION (MAXRECURSION 0)


Оно?
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012200
zloi_templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, court, спасибо за ответы

но эти решения применимы, когда данные о занятости хранятся не в виде интервалов
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012202
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloi_templar
но эти решения применимы, когда данные о занятости хранятся не в виде интервалов
чойта ?
Код: sql
1.
2.
...on cte.room = [таблица занятости номеров].room and cte.d between [таблица занятости номеров].d_start and [таблица занятости номеров].d_finish
where [таблица занятости номеров].room is null
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012230
zloi_templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, cte это таблица календарь, перемноженная на все номера?
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012234
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloi_templar
court, cte это таблица календарь, перемноженная на все номера?
да
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012250
zloi_templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, спасибо, действительно все работает)
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012953
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

Все же иметь "физическую" таблицу календаря лучше. Особенно в нагруженных системах.
...
Рейтинг: 0 / 0
Выбор свободных дат
    #40012985
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloi_templar
но эти решения применимы, когда данные о занятости хранятся не в виде интервалов

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
DECLARE @reserved_intervals TABLE (
    [from] date,
    [to] date
)

INSERT @reserved_intervals ([from], [to])
  VALUES('2/29/2020', '3/8/2020')

;WITH
year_days([date]) AS (
    SELECT CAST('1/1/2020' AS date)
    UNION ALL
    SELECT DATEADD(d, 1, [date])
        FROM year_days WHERE [date] < '12/31/2020'
),
reserved_days([date]) AS (
  SELECT [date] FROM year_days
    WHERE EXISTS(SELECT * FROM @reserved_intervals
        WHERE [date] BETWEEN [from] AND [to])
      
)
SELECT * FROM year_days y 
    WHERE NOT EXISTS (
        SELECT * FROM reserved_days rd WHERE rd.[date] = y.[date] 
    ) 
OPTION (MAXRECURSION 0)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор свободных дат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]