Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вывод количества суток, в которых квартира была занята посетителями / 25 сообщений из 41, страница 1 из 2
07.09.2014, 00:30:31
    #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
07.09.2014, 02:21:46
    #38739632
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
andrew_jr20,

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

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

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

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

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



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

Так что в жизни все бывает :-)
...
Рейтинг: 0 / 0
07.09.2014, 04:09:04
    #38739644
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
javajdbcавторПри этом 10-го числа была занята 2 разаВ примере время не пересекается, а только даты.
...
Рейтинг: 0 / 0
07.09.2014, 04:35:52
    #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
07.09.2014, 10:44:54
    #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
07.09.2014, 12:53:24
    #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
07.09.2014, 13:47:04
    #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
07.09.2014, 13:53:49
    #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
07.09.2014, 13:57:36
    #38739772
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
Lumix,

К сожалению, тоже не то :( Также для данных из первого поста выдаёт 4 вместо 5, а для второго набора - 2 вместо 4.
...
Рейтинг: 0 / 0
07.09.2014, 15:23:14
    #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
07.09.2014, 16:14:03
    #38739815
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
Lumix,

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

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

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

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

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

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

да почему ж не понял - идея понятна: каждому периоду для квартиры подбирается несколько строк из справочника, которые потом группировкой отбрасывают дубляжи и дают нужный результат :) Но раз уж на "ты" - сам-то пробовал прогнать запрос? :) В данном виде он всегда пустой набор выдаёт.
То есть или я и правда не понял, тогда прошу подсказать, в чём я не прав - или в запросе логическая ошибка, тогда хотелось бы довести его до ума :) В любом случае - ещё раз спасибо за участие :)
...
Рейтинг: 0 / 0
07.09.2014, 17:47:19
    #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
07.09.2014, 17:55:13
    #38739848
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
javajdbc,

по пунктам:
1) пересечений для одной квартиры быть не может;
2) длительность - хоть секундная, то есть ошибка оператора при вводе в программу заселения всё равно будет учитываться как "квартира была активная, спрос был"
3, 4) и там, и там по 2 дня
5) ага, с блэкджеком.. (с) на самом деле это для уже давно действующего в нашем городе сервиса сдачи квартир, смениля коммерческий директор, хочет мониторить - вот и придумал такие рейтинги
...
Рейтинг: 0 / 0
07.09.2014, 18:31:40
    #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
07.09.2014, 18:51:10
    #38739876
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
для предложенных данных
Код: sql
1.
2.
3.
4.
SELECT 
SUM(  TIMESTAMPDIFF(HOUR, xxx.datefrom, xxx.dateto) +24)div 24 AS expr1
FROM
  xxx


возврвщает 5
есть больший набор реальных данных?
...
Рейтинг: 0 / 0
07.09.2014, 19:17:28
    #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
07.09.2014, 19:20:49
    #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
07.09.2014, 19:43:47
    #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
07.09.2014, 19:45:00
    #38739898
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вывод количества суток, в которых квартира была занята посетителями
Lumixа решение на секвенсорах учитывает 16546051 ...

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


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