Формат даты в Oracle PlSql

Это существующий код, может ли кто-нибудь объяснить его?

  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'));

person Abc16    schedule 10.12.2015    source источник


Ответы (2)


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
person Lalit Kumar B    schedule 10.12.2015
comment
@ Abc16 Добро пожаловать. Пожалуйста, отметьте это как ответ, это поможет и другим! - person Lalit Kumar B; 10.12.2015

Мне кажется, что количество дней в году возвращается рядом с 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'));
person Husqvik    schedule 10.12.2015