powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как рассчитать количество дней между датами по месяцам?
5 сообщений из 5, страница 1 из 1
Как рассчитать количество дней между датами по месяцам?
    #40028122
lutdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, форумчане!

Есть база данных с клиентами. Клиенты расписаны по периодам пребывания. Необходимо посчитать количество занятых клиентами дней по месяцам. т.е. если клиент находился в гостинице в разных месяцах, то и считать необходимо его в разных месяцах.

в бд, например:
Иванов 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 дней

Помогите, пожалуйста. Куда копать? Может кто поделится функцией?
...
Рейтинг: 0 / 0
Как рассчитать количество дней между датами по месяцам?
    #40028136
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lutdan,

пересекаешь то, что в бд, со списком месяцев
Код: plsql
1.
select add_months(date'2019-01-01',level) as date_from,add_months(date'2019-01-31',level) as date_to from dual connect by level <= 24

считаешь число дней в пересечении и суммируешь по месяцам
Детали из условий задачи добавь
...
Рейтинг: 0 / 0
Как рассчитать количество дней между датами по месяцам?
    #40028209
Vlad074
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Универсальный вариант (может захватить > 2 месяцев):
Код: plsql
1.
2.
3.
4.
5.
6.
WITH
  TM AS (SELECT ADD_MONTHS(TRUNC(:BEG_DATE, 'MM'), ROWNUM-1) AS "MONTH" FROM DUAL CONNECT BY ADD_MONTHS(TRUNC(:BEG_DATE, 'MM'), ROWNUM-1) <= TRUNC(:END_DATE, 'MM'))
SELECT 
  TO_CHAR(TM.MONTH, 'MONTH') AS "MONTH",   
  LEAST(LAST_DAY(TM.MONTH), :END_DATE) - GREATEST(TM.MONTH, :BEG_DATE) + 1 AS DAY_IN_NUM
FROM TM
...
Рейтинг: 0 / 0
Как рассчитать количество дней между датами по месяцам?
    #40028526
lutdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Как рассчитать количество дней между датами по месяцам?
    #40028572
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
connect by выполняется до where и соединяет всех со всеми с месяцами.

нужно либо отдельным подзапросом получить список адресов и посчитать дни. но если месяцем много, а гости проживают не долго, то получится много бесполезных вычислений над декартовым произведением.

либо вот так для каждого периода проживания получить список месяцев и посчитать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create type num_tab as table of number;

select tt.c, tt.t, tt.t2, ADD_MONTHS(trunc(tt.t, 'MM'), tf.column_value-1)
from (
with T as (select 1 c, sysdate-95 t, sysdate-5 t2 from dual union all select 2, sysdate-75 t, sysdate-15 t2 from dual)
select t.*, cast(multiset(select level L from dual CONNECT BY ADD_MONTHS(trunc(t.t, 'MM'), level-1) <= TRUNC(t.t2, 'MM')) as num_tab) f
from t) tt, table(tt.f) tf
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как рассчитать количество дней между датами по месяцам?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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