Запрос на поиск номера дня финансового месяца в Oracle SQL
Запрос должен возвращать номер дня текущего финансового месяца. Проверьте следующий запрос:
SELECT *
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
FROM gl_periods
WHERE TRUNC (SYSDATE) BETWEEN start_date
AND end_date)
Для названия периода: 19 сентября, Start_Date - 26.08.2008. Таким образом, номер дня должен быть 16 для sysdate.
Пример данных:
period_set_name period_name start_date end_date entered_period_name
Fiscal Year AUG-19 7/29/2018 8/25/2018 AUG
Fiscal Year SEP-19 8/26/2018 9/22/2018 SEP
Fiscal Year OCT-19 9/23/2018 10/27/2018 OCT
Ожидаемый результат: 16
2 ответа
Установка Oracle:
CREATE TABLE GL_PERIODS(
period_set_name VARCHAR2(20),
start_date DATE,
end_date DATE,
period_name CHAR(6) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON-YY' ) AS CHAR(6) ) ) VIRTUAL,
entered_period_name CHAR(3) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON' ) AS CHAR(3) ) ) VIRTUAL,
period_year NUMBER(4) GENERATED ALWAYS AS ( EXTRACT( YEAR FROM end_date ) ) VIRTUAL
);
INSERT INTO GL_PERIODS( period_set_name, start_date, end_date )
SELECT 'Fiscal Year', DATE '2018-07-29', DATE '2018-08-25' FROM DUAL UNION ALL
SELECT 'Fiscal Year', DATE '2018-08-26', DATE '2018-09-22' FROM DUAL UNION ALL
SELECT 'Fiscal Year', DATE '2018-09-23', DATE '2018-10-27' FROM DUAL;
Запрос:
SELECT TRUNC( SYSDATE - start_date + 1 ) AS fiscal_day_no
FROM GL_PERIODS
WHERE start_date <= SYSDATE
AND SYSDATE < END_DATE + INTERVAL '1' DAY;
Выход:
| FISCAL_DAY_NO |
|---------------|
| 20 |
Мы можем сделать арифметику по датам. Таким образом, номер сегодняшнего финансового дня будет:
SELECT (trunc(sysdate) - start_date) + 1 as fiscal_day_no
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
FROM gl_periods
WHERE TRUNC (SYSDATE) BETWEEN start_date
AND end_date)
Это предполагает, что у вас нет особых требований для обработки, например, выходных или праздничных дней.