Это существующий код, может ли кто-нибудь объяснить его?
var_l_year_days := to_number(to_char(to_date(to_char(to_date
(ADD_MONTHS(var_l_mnth_details(i) .var_l_mnth_start_date, 12),
'DD-MM-YYYY'),'YYYY') ||'1231','YYYYMMDD'),'DDD'));
Это существующий код, может ли кто-нибудь объяснить его?
var_l_year_days := to_number(to_char(to_date(to_char(to_date
(ADD_MONTHS(var_l_mnth_details(i) .var_l_mnth_start_date, 12),
'DD-MM-YYYY'),'YYYY') ||'1231','YYYYMMDD'),'DDD'));
to_date (ADD_MONTHS(var_l_mnth_details(i) .var_l_mnth_start_date, 12), 'ДД-ММ-ГГГГ')
Это ошибка в вашем коде. Никогда не применяйте TO_DATE в DATE. Это заставляет Oracle:
на основе настроек NLS для конкретной локали. Вам нужно TO_DATE, чтобы преобразовать литерал в дату. Для арифметики даты оставьте дату как есть.
Использовать:
TO_CHAR
- для отображения даты в нужном вам форматеTO_DATE
- преобразовать литерал в дату.Вы можете упростить запрос следующим образом:
SQL> SELECT add_months(TRUNC(SYSDATE,'year'), 24)
2 - add_months(TRUNC(SYSDATE,'year'), 12) days_in_next_year
3 FROM dual;
DAYS_IN_NEXT_YEAR
-----------------
366
Мне кажется, что количество дней в году возвращается рядом с var_l_mnth_details(i).var_l_mnth_start_date
. В основном выяснить, будет ли следующий год високосным или нет.
Хотя это можно упростить до:
var_l_year_days := TO_NUMBER(TO_CHAR(TRUNC(ADD_MONTHS(var_l_mnth_details(i).var_l_mnth_start_date, 24), 'YEAR') - 1, 'DDD'));