Как преобразовать строку в формате 'MMDD' в дату, используя текущий год - PullRequest
0 голосов
/ 23 октября 2019

У меня есть эта процедура, которая идет PROCEDURE(monthday varchar2). Он получает varchar2, представляющий объединенный месяц и дату всегда в формате MMDD . Затем я хочу создать переменную типа DATE, которая использует этот месяц и день, а год является текущим годом.
Как:
desired_date DATE;
desired_date = ?

Я использую Oracle SQL Developer.

Ответы [ 2 ]

4 голосов
/ 23 октября 2019

EXTRACT год с SYSDATE, а затем объедините, используя конкатенацию строк с вашим вводом и используйте TO_DATE для преобразования в дату:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  desired_date := TO_DATE( EXTRACT( YEAR FROM SYSDATE ) || monthday, 'YYYYMMDD' );
END;
/

затем:

DECLARE
  dt DATE;
BEGIN
  test( '0101', dt );
  DBMS_OUTPUT.PUT_LINE( '0101: ' || dt );

  test( '1231', dt );
  DBMS_OUTPUT.PUT_LINE( '1231: ' || dt );

  BEGIN
    test( '9876', dt );
    DBMS_OUTPUT.PUT_LINE( '9876: ' || dt );
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE( '9876: ' || SQLERRM );
  END;
END;
/

выходы:

0101: 2019-01-01 00:00:00
1231: 2019-12-31 00:00:00
9876: ORA-01843: not a valid month

дБ <> скрипка здесь

Если вы хотите вернуть NULLдля недействительных входов:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  desired_date := TO_DATE( EXTRACT( YEAR FROM SYSDATE ) || monthday, 'YYYYMMDD' );
EXCEPTION
  WHEN OTHERS THEN
    -- In general don't catch OTHERS but in this case the only exceptions
    -- are going to be from TO_DATE
    desired_date := NULL;
END;
/

db <> fiddle здесь


Обновление :

Вы можете упростить код (как предложено Алексей и Уильям Робертсон ), не указав значение года в TO_DATE и использовать значение по умолчанию, которое выглядит как текущеегод;однако это поведение, очевидно, не задокументировано ни на одной странице документации Oracle, поэтому я бы также включил встроенную документацию в функцию, чтобы будущие разработчики, проверяющие вашу функцию, знали, что вы сознательно используете это поведение:

CREATE PROCEDURE test (
  monthday     IN  VARCHAR2,
  desired_date OUT DATE
)
IS
BEGIN
  -- Assumes that TO_DATE will, when not specified, default the year to the
  -- current year and the time to midnight.
  desired_date := TO_DATE( monthday, 'MMDD' );
END;
/
2 голосов
/ 23 октября 2019

Это может быть способ

desired_date := to_date(monthday, 'MMDD');

Согласно этому старому сообщению в AskTom , to_date следует использовать текущий год, если не указан:

default year   = current year
default month  = current month
default day    = 1
default hour   = 0
default minute = 0
default second = 0


ops$tkyte%ORA10GR2> select sysdate, to_date( ' ', ' ' ) from dual;

SYSDATE              TO_DATE('','')
-------------------- --------------------
17-aug-2012 13:41:06 01-aug-2012 00:00:00

По-прежнему не удается найти эту информацию в Oracle Docs

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