powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вывод количества суток, в которых квартира была занята посетителями
25 сообщений из 41, страница 1 из 2
вывод количества суток, в которых квартира была занята посетителями
    #38739590
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Не могу сообразить, как подсчитать количество суток, в которых квартира была занята посетителями.
Для примера, есть таблица:

Код: plaintext
1.
2.
id    idapartment    datefrom           dateto
1     1                   07.09.14 10:00  10.09.14 10:00
2     1                   10.09.14 19:00  11.09.14 10:00

В ней квартира с ID=1 за период с 7 по 11 сентября была занята 2 раза. А если смотреть по суткам - то 7, 8, 9, 10 и 11 числа, т.е.5 раз. При этом 10-го числа была занята 2 раза. Каким запросом можно выдернуть результат "5 суток"?
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739632
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20,

как-то наскоком я не вижу решения.
Если по не гунаптся перебором, то
надо создать сквозную таблицу дат
и потом проверить занятость каждого дня.
Не очень чтоб естетично, но работать
будет как швейная машинка Зингер.
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739634
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

Почему бы тупо не просуммировать с контролем занятости первой даты диапазона в качестве последней даты другого диапазона?
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739636
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

ну смотря какие правила --
может быть день приезда и день отезда надо
считать как один день и резервации НИКОГДА
физически не пересекаются -- тогда вообше
можно сумировать с убиранием одного дня от
каждого заказов.

А если заказы таки могут пересекатся?
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739641
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcА если заказы таки могут пересекатся?Судя про фразе "была занята", это не резервации, а лог фактической занятости и диапазоны не должны пересекаться.
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739643
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftjavajdbcА если заказы таки могут пересекатся?Судя про фразе "была занята", это не резервации, а лог фактической занятости и диапазоны не должны пересекаться.

авторПри этом 10-го числа была занята 2 раза



...я как-то к другу приехал в NY, договаривались заранее.
а к нему еще один друг с семьей завалился...
типа того тоже звали но он без подтверждения приехал...
Ну вопшем хозяин квартиры ушел к своей екс спать :-).

Так что в жизни все бывает :-)
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739644
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcавторПри этом 10-го числа была занята 2 разаВ примере время не пересекается, а только даты.
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739646
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

а, ок.... ну тогда просто

Код: sql
1.
2.
3.
4.
5.
select 
   room_id,
   sum(date(reservation_end) - date(reservation_start)) days_reserved
from reservations
group by room_id




andrew_jr20

Кстати, о птичках. Вы когда-нибудь в гостиницах жили?
Допустим 100$ в день.

Если вы заедете и уедете
07.09.14 10:00 10.09.14 10:00
то сколько с вас денег возмут?
А если заедете и уедете
10.09.14 19:00 11.09.14 10:00 ?

Будьте осторожны с датами, а то посодют вас за
кражу :-)
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739681
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы, но пока с мёртвой точки так и не сдвинулся :)

javajdbc: насчёт денег - не волнуйтесь, не посодют :) Для денег есть свой финансовый рейтинг, который учитывает максимально возможные суммы, которые можно получить за данный период, и суммы, которые за этот период были внесены.

А по Вашему запросу из последнего сообщения выдаёт не ту информацию, которая ожидается: то есть, если смотреть по моим изначальным данным, где должно выдать 5 суток - выдаёт всего 4, а если таблицу с данными изменить на приведённую ниже - то всего 2 вместо 3:
Код: plaintext
1.
2.
id 	room_id 	reservation_start 	reservation_end
1 	1 	          07.09.14 10:00:00 	08.09.14 10:00:00
2 	1 	          10.09.14 19:00:00 	11.09.14 10:00:00
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739742
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrew_jr20,

не так посчитал - по вышеуказанной таблице вообще должно 4 дня выдать.

А может упрощением задачи будет получение всех дат из этих периодов? То есть, имеем 2 периода:
07.09-10.09
10.09-11.09

Должны получить:
07.09, 08.09,09.09, 10.09,10.09 ,11.09.
А уже из этой выборки дистинктом убрать лишнее и посчитать количество.
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739768
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20,

Код: sql
1.
2.
3.
select idapartment, sum(sut) sut from 
    (select idaparatment, ceil((dateto - datefrom) / 10e5) sut from reservations) t 
    group by 1
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739769
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcКстати, о птичках. Вы когда-нибудь в гостиницах жили?
Допустим 100$ в день.

Если вы заедете и уедете
07.09.14 10:00 10.09.14 10:00
то сколько с вас денег возмут?
А если заедете и уедете
10.09.14 19:00 11.09.14 10:00 ?

Будьте осторожны с датами, а то посодют вас за
кражу :-)

эта задача не про отель, а про квартиры посуточно
в них правило расчетного часа в 12:00 и продленного расчетного часа до 16:00 не действует
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739772
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumix,

К сожалению, тоже не то :( Также для данных из первого поста выдаёт 4 вместо 5, а для второго набора - 2 вместо 4.
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739791
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20Lumix,

К сожалению, тоже не то :( Также для данных из первого поста выдаёт 4 вместо 5, а для второго набора - 2 вместо 4.

тогда такое решение

сначала создаешь справочник всех дней например с 1 января 2000 года до 1 января 2050 года и заливаешь в него эти даты простейшим скриптом на том языке на каком тебе удобно

потом можешь сделать дапм этого справочника и сложить его в поставку наподобие как обычно приходится таскать справочник geoip для определения географии по айпишнику

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table sprav_sut
( 
    ss_id int auto_increment
    , df datetime
    , dt datetime
    , primary key(ss_id, df, dt)

);

insert into sprav_sut (df, dt) values 
('14.09.06 00:00', '14.09.06 23:59:59')
, ('14.09.07 00:00:00', '14.09.07 23:59:59')
, ('14.09.08 00:00:00', '14.09.08 23:59:59')
...
, ('50.12.31 00:00:00', '50.12.31 23:59:59')



и на основе этого справочника сможешь фильтровать посещения, например, так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select idapartment, count(ss_id) as sut from 
(
    select ss_id, idapartment 
        from reservations d join sprav_sut s 
            on (d.df <= s.df and d.dt >= s.dt) 

        group by 1

) t 

group by 1
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739815
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumix,

Спасибо за наводку, уже гораздо теплее Но тоже не совсем корректно: во-первых, неверно расставлены больше/меньше в условии, так вообще не попадает в справочник. И в таком виде работает только если заселение и выселение в рамках одних суток были произведены. Если заселились 7-го, выселились 9-го, то не попадает в границы справочника.

Сижу сейчас, перепиливаю данный вариант с применением between, чтобы периоды заселений нормально джойнились с нужными периодами из справочника. Буду благодарен, если поможете - а то кручу-верчу, то лишние периоды из справочника цепляю, то наоборот пустой набор выдаёт :)
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739829
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20Lumix,

Спасибо за наводку, уже гораздо теплее Но тоже не совсем корректно: во-первых, неверно расставлены больше/меньше в условии, так вообще не попадает в справочник. И в таком виде работает только если заселение и выселение в рамках одних суток были произведены. Если заселились 7-го, выселились 9-го, то не попадает в границы справочника.

Сижу сейчас, перепиливаю данный вариант с применением between, чтобы периоды заселений нормально джойнились с нужными периодами из справочника. Буду благодарен, если поможете - а то кручу-верчу, то лишние периоды из справочника цепляю, то наоборот пустой набор выдаёт :)

у меня для тебя плохая новость!!!
ты совершенно не понял решение которое я тебе подарил

но поскольку по всем плохом всегда есть и хорошее, то в данном случае хорошее вот в чем:
создавая решение через between ты путем ошибок сможешь насконец-то понять что именно я тебе подарил))))
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739838
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumix,

да почему ж не понял - идея понятна: каждому периоду для квартиры подбирается несколько строк из справочника, которые потом группировкой отбрасывают дубляжи и дают нужный результат :) Но раз уж на "ты" - сам-то пробовал прогнать запрос? :) В данном виде он всегда пустой набор выдаёт.
То есть или я и правда не понял, тогда прошу подсказать, в чём я не прав - или в запросе логическая ошибка, тогда хотелось бы довести его до ума :) В любом случае - ещё раз спасибо за участие :)
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739843
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20Lumix,

К сожалению, тоже не то :( Также для данных из первого поста выдаёт 4 вместо 5, а для второго набора - 2 вместо 4.



andrew_jr20, уточните бизнесс задачу:

1. могут ли резервации пересекатся (учитывая посекундную шкалу) ?

2. Какая минимальная длительность регистрации?

3. допустим имеется единственая резервация на два часа,
с 23:00 одного дня до 01:00 следуюшего дня.
Сколько дней комната была зарезервирована?

4. допустим имеется единственая резервация на две секунды,
с 23:59 одного дня до 00:01 следуюшего дня.
Сколько дней комната была зарезервирована?

5. Вы открываете почасовой бордель?
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739848
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

по пунктам:
1) пересечений для одной квартиры быть не может;
2) длительность - хоть секундная, то есть ошибка оператора при вводе в программу заселения всё равно будет учитываться как "квартира была активная, спрос был"
3, 4) и там, и там по 2 дня
5) ага, с блэкджеком.. (с) на самом деле это для уже давно действующего в нашем городе сервиса сдачи квартир, смениля коммерческий директор, хочет мониторить - вот и придумал такие рейтинги
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739867
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20Lumix,

да почему ж не понял - идея понятна: каждому периоду для квартиры подбирается несколько строк из справочника, которые потом группировкой отбрасывают дубляжи и дают нужный результат :) Но раз уж на "ты" - сам-то пробовал прогнать запрос? :) В данном виде он всегда пустой набор выдаёт.
То есть или я и правда не понял, тогда прошу подсказать, в чём я не прав - или в запросе логическая ошибка, тогда хотелось бы довести его до ума :) В любом случае - ещё раз спасибо за участие :)

ну блииииин...)))
вот вот более топорное решение, но надеюсь более простое в понимании:

Код: 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.
27.
28.
29.
30.
31.
32.
create table bree (i int auto_increment, primary key(i));
insert into bree values (), (), (), (), (), (), (), (), (), (), (), (), (), ();


select idapartment, count(cnt) as cnt from
(
    select distinct stayday as cnt, idapartment from
    (
        select 
        idapartment
        , if 
        (
            unix_timestamp(date(d.datefrom))
            - unix_timestamp(date(d.dateto)) 
            - 60 * 60 * 24 * (s.i - 1)) 

                >= 0, 

            date(d.datefrom + 10e5 * (s.i - 1))
            , 0

        ) stayday

        from reservations d, bree s 
        
    ) t1

    where stayday > 0

) t2

group by 1
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739876
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для предложенных данных
Код: sql
1.
2.
3.
4.
SELECT 
SUM(  TIMESTAMPDIFF(HOUR, xxx.datefrom, xxx.dateto) +24)div 24 AS expr1
FROM
  xxx


возврвщает 5
есть больший набор реальных данных?
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739885
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадядля предложенных данных
Код: sql
1.
2.
3.
4.
SELECT 
SUM(  TIMESTAMPDIFF(HOUR, xxx.datefrom, xxx.dateto) +24)div 24 AS expr1
FROM
  xxx


возврвщает 5
есть больший набор реальных данных?
Не так считает - высчитывает часы и из них формирует сутки, а нужно иное, на следующем периоде уже будет не то, что надо:
07.09.14 23:55 08.09.14 09:00
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739887
andrew_jr20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lumix,

вот рабочий вариант того запроса, попробовал уже разнообразные периоды - всегда как надо считает, спасибо за наводку :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select room_id, count(ss_id) as sut from 
(
    select ss_id, room_id 
	from reservations d join sprav_sut s 
	on ((s.df between d.reservation_start and d.reservation_end or s.dt between d.reservation_start and d.reservation_end) or (s.df < d.reservation_end and s.dt > d.reservation_start))  
        group by s.ss_id
) t 
group by room_id
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739896
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_jr20Lumix,

вот рабочий вариант того запроса, попробовал уже разнообразные периоды - всегда как надо считает, спасибо за наводку :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select room_id, count(ss_id) as sut from 
(
    select ss_id, room_id 
	from reservations d join sprav_sut s 
	on ((s.df between d.reservation_start and d.reservation_end or s.dt between d.reservation_start and d.reservation_end) or (s.df < d.reservation_end and s.dt > d.reservation_start))  
        group by s.ss_id
) t 
group by room_id


внимание, ловушка!!!)))
этот запрос не учитывает квартиры, которые были сданы на несколько часов в течение одних суток)))

например такую
Код: sql
1.
2.
id    idapartment    datefrom           dateto
1     5              07.09.14 10:00     07.09.14 19:00



а решение на секвенсорах учитывает 16546051 ...
...
Рейтинг: 0 / 0
вывод количества суток, в которых квартира была занята посетителями
    #38739898
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixа решение на секвенсорах учитывает 16546051 ...

опааа, ошибочная ссылка
правильная вот эта 16546483
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вывод количества суток, в которых квартира была занята посетителями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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