|
Как рассчитать количество дней между датами по месяцам?
|
|||
---|---|---|---|
#18+
Добрый день, форумчане! Есть база данных с клиентами. Клиенты расписаны по периодам пребывания. Необходимо посчитать количество занятых клиентами дней по месяцам. т.е. если клиент находился в гостинице в разных месяцах, то и считать необходимо его в разных месяцах. в бд, например: Иванов 16.01.2020 - 31.01.2020 15 дней (15 дней января) Петров 30.01.2020 - 05.02.2020 6 дней (2 дня января и 5 дней февраля) Сидоров 25.01.2020 - 10.02.2020 16 дней (6 дней января и 10 дней февраля) В отчет: Январь 23 дня Февраль 15 дней Помогите, пожалуйста. Куда копать? Может кто поделится функцией? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 20:30 |
|
Как рассчитать количество дней между датами по месяцам?
|
|||
---|---|---|---|
#18+
lutdan, пересекаешь то, что в бд, со списком месяцев Код: plsql 1.
считаешь число дней в пересечении и суммируешь по месяцам Детали из условий задачи добавь ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 21:38 |
|
Как рассчитать количество дней между датами по месяцам?
|
|||
---|---|---|---|
#18+
Универсальный вариант (может захватить > 2 месяцев): Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2020, 08:09 |
|
Как рассчитать количество дней между датами по месяцам?
|
|||
---|---|---|---|
#18+
Vlad074, Спасибо. Написал такой запрос SELECT tm.fio, TO_CHAR(TM.MONTH, 'MONTH') AS "MONTH", LEAST(LAST_DAY(TM.MONTH), dat1) - GREATEST(TM.MONTH, po_dat) + 1 AS DAY_IN_NUM FROM ( SELECT /*fn_customer_name_by_id (v_out.customerid) */'yyy' AS fio, v_out.po_dat AS po_dat , v_out.dat1 AS dat1 ,ADD_MONTHS(TRUNC(v_out.po_dat, 'MM'), ROWNUM-1) AS "MONTH" FROM v_visit_come_out v_out WHERE v_out.depid = 52 AND v_out.po_dat>= TO_DATE('2020-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND v_out.po_dat<= TO_DATE('2020-12-12 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND v_out.num = 8975 -- номер клиента для тестов (потом уберу) CONNECT BY ADD_MONTHS(TRUNC(v_out.po_dat, 'MM'), ROWNUM-1) <= TRUNC(v_out.dat1, 'MM') ) TM po_dat - дата поступления dat1 - дата выбытия Но при таком запросе ошибка: ORA-30009: Not enough memory for CONNECT BY operation ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2020, 23:03 |
|
Как рассчитать количество дней между датами по месяцам?
|
|||
---|---|---|---|
#18+
connect by выполняется до where и соединяет всех со всеми с месяцами. нужно либо отдельным подзапросом получить список адресов и посчитать дни. но если месяцем много, а гости проживают не долго, то получится много бесполезных вычислений над декартовым произведением. либо вот так для каждого периода проживания получить список месяцев и посчитать. Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 03:37 |
|
|
start [/forum/topic.php?fid=52&fpage=29&tid=1880597]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 127ms |
0 / 0 |