Oracle реализует набор функций для работы со значениями типа даты/времени. Мы не будем подробно рассматривать все функции, но сводка в табл. 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
. Будьте осторожны!