в локальном времени того места, где размещена база данных, но вы видите эти данные нормализованными
ко времени вашего часового пояса.
Предположим, что часовым поясом нашей базы данных является PST
(отстает на 7 часов от UTC) и нужно записать в базу данных следующие
данные:
□ 2005-05-13 07:15:30 EST
Поскольку EST отстает от UTC на четыре часа, из ваших данных вычитается
разница во времени между EST и PST, составляющая три часа
(7-4=3), в результате чего в базу данных будет записано следующее нормализованное
значение метки даты/времени:
□ 2005-05-13 04:15:30
Следующий оператор создает таблицу purchases_with_local_tz, в которой
хранятся покупки покупателя. В этой таблице есть столбец типа
TIMESTAMP WITH LOCAL TIME ZONE, названный made_on, в котором хранится
время совершения покупки:
□ CREATE TABLE purchases_with_local_tz (
product_id INTEGER REFERENCES products(product_id),
customer_id INTEGER REFERENCES customers (customer_id),
made_on TIMESTAMP(4) WITH LOCAL TIME ZONE
);
Оператор INSERT добавляет к таблице purchases_with_local_tz строку,
содержащую значение 2005-05-13 07:15:30 EST столбца dob:
□ INSERT INTO purchases_with_local_tz (
product_id, customer_id, made_on
) VALUES (
1, 1, TIMESTAMP ‘ 2005-05-13 07:15:30 EST’
);
Следующий запрос осуществляет выборку строки:
□ SELECT *
FROM purchases_with_local_tz;
PR0DUCT_ID CUST0MER_ID MADEJDN
1 1 13-MAY-05 04.15.30.0000 AM
В базе данных хранится только нормализованное значение, а обозначение
часового пояса не выводится.
Хранение и обработка дат и времени 161
Предупреждение Значения метки даты/времени будут нормализованы к часовому поясу, в
котором расположена ваша база данных, поэтому они могут не совпадать с приведенными
здесь значениями.
Если затем установить локальный часовой пояс для вашего сеанса на
EST и повторить предыдущий запрос, вы увидите значение метки даты/
времени, нормализованное ко времени EST:
□ ALTER SESSION SET TIME_Z0NE = 'EST';
Session altered.
SELECT *
FROM purchases_with_local_tz;
PRODUCT_ID CUSTOMER_ID MADE_0N
1 1 13-MAY-05 07.15.30.0000 AM
Функции, связанные с метками дат/времени
Некоторые функции позволяют вам получать и обрабатывать значения
типа метка даты/времени (см. таблицу 5-7).
Таблица 5.7. Функции, связанные с метками дат/времени
Функция Описание
CURRENT_TIMESTAMP()
EXTRACT({ YEAR | MONTH
| DAY | HOUR | MINUTE |
SECOND } | {TIMEZ0NE_
HOUR | TIMEZ0NE_MINUTE
} | {TIMEZ0NE_REGI0N |
TIMEZ0NE_ABBR } FROM x)
FR0M_TZ(x, часовой_по-
яс)
L0CALTIMESTAMPO
SYSTIMESTAMP()
SYS_EXTRACT_UTC(x)
T0_TIMESTAMP(x [, формат])
Возвращает тип TIMESTAMP WITH LOCAL TIME ZONE, содержащий
время текущего сеанса и его часовой пояс.
Выделяет из х и возвращает год, месяц, день, час, минуту, секунду
или часовой пояс; х может быть одним из типов метка
даты/времени или типа DATE.
Конвертирует х типа TIMESTAMP и часовой пояс, специфицированный
параметром часовой_пояс, в тип TIMESTAMP WITH
TIMEZ0NE.
Возвращает тип TIMESTAMP, содержащий текущую дату и
время сеанса.
Возвращает тип TIMESTAMP WITH TIMEZ0NE, содержащий
текущее время базы данных наряду с ее временным поясом.
Конвертирует х типа TIMESTAMP WITH TIMEZ0NE в тип
TIMESTAMP, содержащий дату и время в UTC.
Конвертирует строку х в тип TIMESTAMP. Можно специфицировать
для х дополнительный параметр формат.
T0_TIMESTAMP_TZ(x [
формат])
Конвертирует строку х в тип TIMESTAMP WITH TIMEZ0NE.
Можно специфицировать для х дополнительный параметр
формат.
162 Глава 5
C U R R E N T _T IM E S T AM P (), LO C A L T IM E S T AM P () и
SYSTIMESTAMP()
В приведенном ниже запросе содержатся вызовы функций CURRENT
TIMESTAMPO, L0CALTIMESTAMPO и SYSTIMESTAMP():
□ SELECT CURRENT_TIMESTAMP, LOCALTIMESTAHP, SYSTIMESTAHP
FROM dual;
CURRENT_TIMESTAMP
LOCALTIMESTAMP
SYSTIMESTAMP
07-0CT-03 10.41.24.000000 AM -07:00
07-0CT-03 10.41.24.000000 AM
07-0CT-03 10.41.24.000000 AM -07:00
Если после этого изменить часовой пояс на EST и повторить запрос, то
получатся следующие выходные данные:
П ALTER SESSION SET TIMEjZON'E = 'EST';
Session altered.
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP, SYSTIMESTAMP
FROM dual;
CURRENT_TIMESTAMP
LOCALTIMESTAMP
SYSTIMESTAMP
07-0CT-03 01.42.30.000000 PM EST
07-0CT-03 01. 42.30.000000 PM
07-0CT-03 10. 42.30.000000 AM -07.00
Обратите внимание на изменения результатов этого и предыдущих
примеров.
EX TR AC T ()
Функция EXTRACT( ) используется для экстрагирования и возврата года, месяца,
дня, часа, минут, секунд или часового пояса из значения х; х может
быть одним из типов TIMESTAMP или DATE. В следующем примере EXTRACT()
используется для извлечения, года, месяца и дня из значения DATE, возвращаемого
функцией T0_DATE():
□ SELECT
EXTRACT(YEAR FROM T0_DATE(‘ 01-JAN-2005 19:15:26’ ,
‘ DD-MON-YYYY HH24:MI:SS’ ) ) AS YEAR,
EXTRACT(MONTH FROM T0_DATE(‘ 01-JAN-2005 19:15:26’ ,
‘ DD-MON-YYYY HH24:MI:SS’ ) ) As MONTH,