как получить точные дни после разделения по дате в соответствии с финансовым годом в oracle

Я разделил две даты «10-Jun-2016» и «09-Jun-2019» на следующие диапазоны дат:

10-Jun-2016 31-Mar-2017 294
01-Apr-2017 31-Mar-2018 364
01-Apr-2018 31-Mar-2019 364
01-Apr-2019 09-Jun-2019 69

Если я подсчитаю разницу в количестве дней, то получится 1091, но если я возьму разницу в днях этих двух дат «10-Jun-2016» и «09-Jun-2019» получится 1094.

Как получить точное количество дней после разделения?

2 ответа

  1. Вы не должны подсчитывать разницу между лимитами дат, вы должны подсчитывать общее количество дней в диапазоне. т. е. (дата 2 — Дата 1 + 1) вместо (дата 2 — Дата 1).

  2. Запрос:

    WITH date_ranges ( start_date, end_date ) AS (
      SELECT DATE '2016-06-10', DATE '2019-06-09' FROM DUAL
    ),
    financial_years ( start_date, end_date, year_start ) AS (
      SELECT start_date,
             end_date,
             ADD_MONTHS( TRUNC( ADD_MONTHS( start_date, -3 ), 'Y', 12 * LEVEL - 9 )
      FROM   date_ranges
      CONNECT BY ADD_MONTHS( TRUNC( ADD_MONTHS( start_date, -3 ), 'Y', 12 * LEVEL - 9 ) <= end_date
    ),
    financial_year_ranges ( start_date, end_date ) AS (
      SELECT GREATEST( start_date, year_start ),
             LEAST( end_date, ADD_MONTHS( year_start, 12 ) - 1 )
      FROM   financial_years
    )
    SELECT start_date,
           end_date,
           end_date - start_date + 1 AS num_days
    FROM   financial_year_ranges;
    

    Выход:

    START_DATE END_DATE   NUM_DAYS
    ---------- ---------- --------
    2016-06-10 2017-03-31      295
    2017-04-01 2018-03-31      365
    2018-04-01 2019-03-31      365
    2019-04-01 2019-06-09       70