Функции CAST и EXTRACT в PL/SQL

CAST и EXTRACT в PL/SQLСтандартные функции SQL CAST и EXTRACT часто бывают полезными при работе с датой/временем. Функция CAST появилась в Oracle8 как механизм явного определения типов коллекций, а в Oracle8i ее возможности были расширены. Теперь функция CAST может использоваться для преобразования значений даты/времени в символьные строки, и наоборот. Функция EXTRACT, введенная в Oracle9i, позволяет выделять отдельные компоненты из значений даты/времени и интервалов.

 

Функция CAST

Функция CAST может использоваться для выполнения следующих операций с датой/временем:

  • преобразование символьной строки в значение даты/времени;
  • преобразование значения даты/времени в символьную строку;
  • преобразование значения одного типа даты/времени (например, DATE) в значение другого типа (например, TIMESTAMP).

При использовании функции CAST для преобразования значений даты/времени в символьные строки и обратно учитываются значения параметров NLS. Чтобы проверить свои настройки NLS, запросите представление V$NLS_PARAMETERS, а для их изменения используется команда ALTER SESSION. Параметры NLS для даты/времени:

  • NLS_DATE_FORMAT — используется при преобразовании в тип данных DATE и обратно;
  • NLS_TIMESTAMP_FORMAT — используется при преобразовании в типы данных TIMESTAMP и TIMESTAMP WITH LOCAL TIME ZONE.
  • NLS_TIMESTAMP_TZ_FORMAT — используется при преобразовании в тип данных TIMESTAMP WITH TIME ZONE и обратно.

В следующем примере показано, как выполняется каждый тип преобразования. Предполагается, что для NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT и NLS_TIMESTAMP_TZ_FORMAT используются значения по умолчанию 'DD-MON-RR', 'DD-MON-RR HH.MI.SSXFF AM' и 'DDMON- RR HH.MI.SSXFF AM TZR' соответственно. 

DECLARE
tstz TIMESTAMP WITH TIME ZONE;
string VARCHAR2(40);
tsltz TIMESTAMP WITH LOCAL TIME ZONE;
BEGIN
-- Преобразование строки в дату/время
tstz := CAST ('24-Feb-2009 09.00.00.00 PM US/Eastern'
AS TIMESTAMP WITH TIME ZONE);
-- Преобразование даты/времени обратно в строку
string := CAST (tstz AS VARCHAR2);
tsltz := CAST ('24-Feb-2009 09.00.00.00 PM'
AS TIMESTAMP WITH LOCAL TIME ZONE);
DBMS_OUTPUT.PUT_LINE(tstz);
DBMS_OUTPUT.PUT_LINE(string);
DBMS_OUTPUT.PUT_LINE(tsltz);
END;

Результат:

24-FEB-09 09.00.00.000000 PM US/EASTERN
24-FEB-09 09.00.00.000000 PM US/EASTERN
24-FEB-09 09.00.00.000000 PM 

Здесь на основе символьной строки генерируется значение типа TIMESTAMP WITH TIME ZONE, которое преобразуется в VARCHAR2, а затем в TIMESTAMP WITH LOCAL TIME ZONE.

Резонно спросить — зачем использовать CAST? Действительно, эта функция частично перекрывается с функциями TO_DATE, TO_TIMESTAMP и TO_TIMESTAMP_TZ. Однако функция TO_TIMESTAMP может получать в качестве входных данных только строку, тогда как CAST может получить строку или DATE и преобразовать полученное значение в TIMESTAMP. Таким образом, CAST используется в тех случаях, когда возможностей функций TO_оказывается недостаточно. Но если задачу можно решить при помощи функции TO_,лучше использовать именно ее, потому что код обычно получается более понятным.

В команде SQL при вызове CAST можно указать размер значения типа данных, например CAST (x AS VARCHAR2(40)). Однако PL/SQL не позволяет задать размер значения целевого типа данных.

 

Функция EXTRACT

Функция EXTRACT используется для извлечения компонентов из значения даты/времени.

Синтаксис:

EXTRACT (имя_компонента, FROM {дата_время | интервал}) 

Здесь имя_компонента — имя одного из элементов даты/времени, перечисленных в табл. 1. Имена компонентов не чувствительны к регистру символов. В аргументе дата_время или интервал задается действительное значение даты/времени или интервала. Тип возвращаемого функцией значения зависит от извлекаемого компонента.

Имя компонента Возвращаемый тип данных
YEAR NUMBER
MONTH NUMBER
DAY NUMBER
HOUR NUMBER
MINUTE NUMBER
SECOND NUMBER
TIMEZONE_HOUR NUMBER
TIMEZONE_MINUTE NUMBER
TIMEZONE_REGION VARCHAR2
TIMEZONE_ABBR VARCHAR2

В следующем примере функция EXTRACT используется для проверки того, является ли текущий месяц ноябрем:

BEGIN
IF EXTRACT (MONTH FROM SYSDATE) = 11 THEN
DBMS_OUTPUT.PUT_LINE('Сейчас ноябрь');
ELSE
DBMS_OUTPUT.PUT_LINE('Сейчас не ноябрь');
END IF;
END; 

Функцию EXTRACT удобно использовать в тех случаях, когда управление потоком выполнения программы осуществляется в зависимости от значения одного из элементов даты/времени, а также в тех случаях, когда требуется получить числовое значение одного из элементов даты/времени.

Вас заинтересует / Intresting for you:

Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 14838 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 4651 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 12331 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Символьные функции и аргументы...
Символьные функции и аргументы... 18586 просмотров Анатолий Wed, 23 May 2018, 18:54:01
Войдите чтобы комментировать