Функции для работы с датой и временем в PL/SQL

Функции даты и времени в Oracle PL/SQLOracle реализует набор функций для работы со значениями типа даты/времени. Мы не будем подробно рассматривать все функции, но сводка в табл. 1 познакомит Вас с доступными возможностями. Если какие-то функции вас заинтересуют, обращайтесь за подробным описанием к справочнику Oracle SQL Reference.

Избегайте использования традиционных функций Oracle, обрабатывающих значения типа DATE, при работе с новыми типами данных TIMESTAMP. Вместо них следует по возможности использовать новые функции для типов INTERVAL. А DATE-функции должны использоваться только для обработки значений типа DATE.

Многие из приведенных в табл. 1 функций (в том числе ADD_MONTHS) получают значения типа DATE. При использовании таких функций с новыми типами данных TIMESTAMP могут возникнуть проблемы. Хотя любой из этих функций можно передать значение типа TIMESTAMP, Oracle неявно преобразует его к типу DATE, и только тогда функция выполнит свою задачу, например: 

DECLARE
ts TIMESTAMP WITH TIME ZONE;
BEGIN
ts := SYSTIMESTAMP;
--Обратите внимание: в значении переменной ts задаются
--дробные секунды И часовой пояс.
DBMS_OUTPUT.PUT_LINE(ts);
--Изменение значения ts одной из встроенных функций.
ts := LAST_DAY(ts);
--Дробные секунды ПОТЕРЯНЫ, а часовой пояс заменен
--часовым поясом сеанса.
DBMS_OUTPUT.PUT_LINE(ts);
END;

Результат:

13-MAR-05 04.27.23.163826 PM -08:00
31-MAR-05 04.27.23.000000 PM -05:00 

Имя Описание
ADD_MONTHS Возвращает значение DATE, полученное в результате увеличения заданного значения DATE на заданное количество месяцев. См. «Сложение и вычитание интервалов»
CAST Выполняет преобразования между типами данных — например, между DATE и различными значениями TIMESTAMP. См. «CAST и EXTRACT»
CURRENT_DATE Возвращает текущую дату и время в часовом поясе сеанса как значение типа DATE
CURRENT_TIMESTAMP Возвращает текущую дату и время в часовом поясе сеанса как значение типа TIMESTAMP WITH TIME ZONE
DBTIMEZONE Возвращает смещение часового пояса базы данных относительно UTC в форме символьной строки (например, '-05:00'). Часовой пояс базы данных используется только при работе со значениями типа TIMESTAMP WITH LOCAL TIME ZONE
EXTRACT Возвращает значение NUMBER или VARCHAR2, содержащее конкретный элемент даты/времени — час, год или сокращение часового пояса. См. «CAST и EXTRACT»
FROM_TZ Преобразует TIMESTAMP и данные часового пояса в значение типа TIMESTAMP WITH TIME ZONE
LAST_DAY Возвращает последний день месяца для заданного входного значения DATE
LOCALTIMESTAMP Возвращает текущую дату и время как значение типа TIMESTAMP в локальном часовом поясе
MONTHS_ BETWEEN Возвращает значение NUMBER, содержащее количество месяцев между двумя датами. См. «Вычисление интервала между двумя значениями DATE»
NEW_TIME Преобразует значение типа DATE одного часового пояса в аналогичное значение другого пояса. Функция существует для сохранения совместимости со старым кодом; в новых приложениях следует использовать типы TIMESTAMP WITH TIME ZONE или TIMESTAMP WITH LOCAL TIME ZONE
NEXT_DAY Возвращает дату первого дня недели, следующего за указанной датой
NUMTODSINTERVAL Преобразует заданное количество дней, часов, минут или секунд (на ваш выбор) в значение типа INTERVAL DAY TO SECOND
NUMTOYMINTERVAL Преобразует заданное количество годов и месяцев (на ваш выбор) в значение типа INTERVAL YEAR TO MONTH
ROUND Возвращает значение типа DATE, округленное до заданных единиц
SESSIONTIMEZONE Возвращает смещение часового пояса сеанса (относительно UTC) в форме символьной строки
SYS_EXTRACT_UTC Преобразует значение типа TIMESTAMP WITH TIME ZONE в значение TIMESTAMP с той же датой и временем, нормализованное по времени UTC
SYSDATE Возвращает текущую дату и время сервера Oracle как значение типа DATE
SYSTIMESTAMP Возвращает текущую дату и время сервера Oracle как значение типа TIMESTAMP WITH TIME ZONE
TO_CHAR Преобразует значение даты/времени в символьную строку. См. «Преобразование даты и времени»
TO_DATE Преобразует символьную строку в значение типа DATE. См. «Преобразование даты и времени»
TO_DSINTERVAL Преобразует символьную строку в значение типа INTERVAL DAY TO SECOND. См. «Преобразования интервалов»
TO_TIMESTAMP Преобразует символьную строку в значение типа TIMESTAMP. См. «Преобразование даты и времени»
TO_TIMESTAMP_TZ Преобразует символьную строку в значение типа TIMESTAMP WITH TIME ZONE. См. «Преобразование даты и времени»
TO_YMINTERVAL Преобразует символьную строку в значение типа INTERVAL YEAR TO MONTH. См. «Преобразования интервалов»
TRUNC Возвращает значение типа DATE, усеченное до заданных единиц
TZ_OFFSET Возвращает смещение относительно UTC часового пояса, заданного названием или сокращением, в форме VARCHAR2 (например, '-05:00')

В этом примере переменная ts содержит значение типа TIMESTAMP WITH TIME ZONE. Это значение неявно преобразуется в DATE при передаче LAST_DAY. Поскольку в типе DATE не сохраняются ни дробные части секунд, ни смещение часового пояса, эти части значения ts попросту отбрасываются. Результат LAST_DAY снова присваивается ts, что приводит к выполнению второго неявного преобразования — на этот раз DATE преобразуется в TIMESTAMP WITH TIME ZONE. Второе преобразование получает часовой пояс сеанса, поэтому в смещении часового пояса в итоговом значении мы видим ?05:00.

Очень важно понимать эти преобразования... и избегать их. Несомненно, вы представляете, какие коварные ошибки могут появиться в программе из-за неосторожного использования функций DATE со значениями TIMESTAMP. Честно говоря, я не представляю, почему в Oracle встроенные функции DATE не были перегружены для нормальной работы с TIMESTAMP. Будьте осторожны!

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

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