Выбрать главу

в локальном времени того места, где размещена база данных, но вы видите эти данные нормализованными

ко времени вашего часового пояса.

Предположим, что часовым поясом нашей базы данных является 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,