To_date без предупреждения о формате - PullRequest
1 голос
/ 07 ноября 2019

После того, как я скомпилировал свой код, я получил несколько предупреждений / подсказок, от которых мне нужно избавиться. первый - To_date без формата Format

_current_end := to_date(((to_number(yearStatus)) ||
                                          MonthAndDay),
                                          'YYYYMMDD');

Я получаю сообщение об ошибке "Подсказка TO_DATE без формата в имя_процесса", но я думал, что YYYYMMDD должен был его убрать.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 08 ноября 2019

Больше скобок, чем необходимо, не делает вещи лучше. PL / SQL не является Lisp (где больше круглых скобок, чем необходимо, также не годятся :-) - вам не нужно заключать в скобки все вызовы функций. Кроме того, слишком много пустого пространства в IMO так же плохо, как и слишком мало.

current_end := TO_DATE(TO_NUMBER(yearStatus) || MonthAndDay, 'YYYYMMDD');

легче читать и понимать, по крайней мере, на мой взгляд.

dbfiddle здесь

1 голос
/ 07 ноября 2019

Есть 2 лишних скобки:

Этот небольшой блок отлично работает:

Declare
  yearStatus   varchar2(4):='2019';
  MonthAndDay  varchar2(4):='1101';
  current_end  date;
begin
  current_end:=to_date(to_number(yearStatus)||MonthAndDay,
                       'YYYYMMDD'
                       );
  Dbms_Output.Put_Line('current_end='||to_char(current_end,'yyyy-mm-dd hh24:mi:ss'));
End;
/

вывод:

PL/SQL block, executed in 62 ms
current_end=2019-11-01 00:00:00
Total execution time 343 ms
0 голосов
/ 10 ноября 2019

На самом деле вы можете удалить объединение строк все вместе.

alter session set nls_date_format = 'yyyy/mm/dd"T"hh24:mi:ss';
declare
  yearstatus  char(4) := '2019';
  current_end date;
begin
  current_end := trunc(to_date(yearstatus,'yyyy'),'yyyy');
  dbms_output.put_line( current_end );
end;

Это лучше? Ваш выбор.

0 голосов
/ 08 ноября 2019

В ваших скобках нет ничего плохого (да, вы можете удалить некоторые из них, но это не правильный синтаксис, чтобы оставить их там);однако вы не можете иметь переменную, начинающуюся с подчеркивания в PL / SQL.

DECLARE
  yearStatus  CHAR(4) := '2019';
  MonthAndDay CHAR(4) := '0101';
  current_end DATE;
BEGIN
  current_end := to_date(((to_number(yearStatus)) ||
                                          MonthAndDay),
                                          'YYYYMMDD');
  DBMS_OUTPUT.PUT_LINE( current_end );
END;
/

Выводы:

2019-01-01T00:00:00

Однако, если вы хотите упроститьЗатем вы можете избавиться от вызова TO_NUMBER, так как оператор конкатенации || неявным образом преобразует его обратно в строку:

DECLARE
  yearStatus  CHAR(4) := '2019';
  MonthAndDay CHAR(4) := '0101';
  current_end DATE;
BEGIN
  current_end := to_date(yearStatus || MonthAndDay, 'YYYYMMDD');
  DBMS_OUTPUT.PUT_LINE( current_end );
END;
/

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...