Стандартные функции 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
удобно использовать в тех случаях, когда управление потоком выполнения программы осуществляется в зависимости от значения одного из элементов даты/времени, а также в тех случаях, когда требуется получить числовое значение одного из элементов даты/времени.