Тип даних TIME в Oracle, Інші СУБД, Бази даних, статті

Автор: М.Велікіх, інженер ЦТП Oracle компанія “АйТі”


Введення


В даній статті хотілося б розповісти про недокументовані тип даних TIME, реалізований в Oracle. Новачки в Oracle часто забувають, що тип даних DATE також містить час, іноді намагаються створювати свої типи даних для зберігання саме часу або зовсім зберігають час в строкових типах даних (CHAR, VARCHAR2). У мої цілі не входить обговорення того, чому корпорація Oracle до цих пір офіційно не дозволяє цей тип даних і не включає його в наступні релізи Oracle Server, я тільки покажу, як це працює. За моїми даними, тип даних TIME існує в Oracle, починаючи з версії 8.1.6, тобто вже досить давно, весь цей час залишаючись прихованим від широкої громадськості, хоча згадка деяких з ним пов’язаних функцій легко виявити в пакеті DBMS_STANDARD. Всі проведені експерименти перевірялися з незначними застереженнями на версіях 8.1.7.4, 9.2.0.7, 10.2.0.1. Отже, приступимо.

Як включити тип даних TIME

Включення використання типу даних TIME можна домогтися установкою події 10407 на рівні сесії. Без включення даної події тип даних TIME залишається заблокованим, і всі звернення до нього або до залежних функціям будуть закінчуватися різними помилками. Нижче наведено лістинг включення даної події і створення таблиці з єдиним полем типу даних TIME (0).

Лістинг 1




SCOTT@O102>exec dbms_output.put_line (sqlerrm(-10407));
ORA-10407: enable datetime TIME datatype creation
PL/SQL procedure successfully completed.
SCOTT@O102> –Create table with time datatype
SCOTT@O102>create table t (tm time);
create table t (tm time)
*
ERROR at line 1:
ORA-00902: invalid datatype
SCOTT@O102> –Set event 10407 and try again
SCOTT@O102>alter session set events “10407 trace name context forever, level 1”;
Session altered.
SCOTT@O102>create table t (tm time);
Table created.
SCOTT@O102>desc t
Name Null? Type
—————————————– ——– ————————-
TM TIME(0)
SCOTT@O102>insert into t select to_time(“01.02.”//level*5) from dual connect by
level<=5;
5 rows created.
SCOTT@O102>select * from t;
TM
—————————————————————————
01.02.05 AM
01.02.10 AM
01.02.15 AM
01.02.20 AM
01.02.25 AM

У парі до типу даних TIME, існує тип даних TIME WITH TIME ZONE, який додатково зберігає ще години та хвилини тимчасової зони. Якщо звернути увагу, то насправді ми в попередньому прикладі створили таблицю типу даних TIME (0) – у поточній реалізації тип даних TIME може зберігати і частки, менші секунди. Тобто TIME (n) служить для зберігання: годин, хвилин, секунд і 10n часток секунди (де n – ціле від 0 до 9).

Пов’язані NLS-параметри

NLS-параметри, пов’язані з типом даних TIME, підкоряються абсолютно тим же правилам, що й інші NLS-параметри (типів DATE, TIMESTAMP і т.д.). Як мені відомо, є лише два таких NLS-параметра: перший для TIME, другий для TIME WITH TIME ZONE. Розглянемо невеликий приклад.

Лістинг 2




SCOTT@O102>col parameter for a30
SCOTT@O102>col value for a30
SCOTT@O102>select * from nls_session_parameters where parameter like “%TIME\_%” escape “”;
PARAMETER VALUE
—————————— ——————————
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
SCOTT@O102>desc t1
Name Null? Type
—————————————– ——– ————————-
TM TIME(6)
SCOTT@O102>select * from t1;
TM
—————————————————————————
01.02.03.456789 AM
SCOTT@O102>alter session set nls_time_format=”HH24:MI:SSXFF”;
Session altered.
SCOTT@O102>select * from t1;
TM
—————————————————————————
01:02:03.456789

Функції типу даних TIME

Наведу приклад використання декількох функцій, їх декларацію можна подивитися в специфікації пакета DBMS_STANDARD.

Лістинг 3




SCOTT@O102>alter session set nls_time_format=”HH24:MI:SSXFF”;
Session altered.
SCOTT@O102>alter session set nls_time_tz_format=”HH24:MI:SSXFF TZH:TZM”;
Session altered.
SCOTT@O102>col tm for a40 SCOTT @ O102> – CURRENT_TIME – поточний час з тимчасовою зоною
SCOTT@O102>select current_time tm from dual;
TM
—————————————-
02:22:34 +06:00 SCOTT @ O102> – LOCALTIME – локальний час
SCOTT@O102>select localtime tm from dual;
TM
—————————————-
02:23:29
SCOTT@O102>
– TO_TIME – перетворення рядка до типу TIME, опціональний другий аргумент – NLS-format
SCOTT@O102>select to_time(“01.02.03″,”hh24.mi.ss”) tm from dual;
TM
—————————————-
01:02:03.000000000 SCOTT @ O102> – TO_TIME_TZ – аналогічний TO_TIME, але повертає TIME WITH TIME ZON
SCOTT@O102>select to_time_tz(“01.02.03″,”hh24.mi.ss”) tm from dual;
TM
—————————————-
01:02:03.000000000 +06:00 SCOTT @ O102> – EXTRACT – дія, як і для інших DATETIME типів даних
SCOTT@O102>col hour for 9999
SCOTT@O102>col min for 999
SCOTT@O102>col sec for 90.999999999
SCOTT@O102>with t as (select to_time(“01.02.03.123456789″,”hh24.mi.ssxff”) tm
2 from dual)
3 select extract (hour from tm) hour,
4 extract (minute from tm) min,
5 extract (second from tm) sec
6 from t
7 /
HOUR MIN SEC
—– —- ————-
1 2 3.123456789 SCOTT @ O102> – TO_CHAR – аналогічна TO_CHAR (datetime)
SCOTT@O102>col tm for a20
SCOTT@O102>select to_char(current_time,”hh-mi AM “TZ” TZH:TZM”) tm from dual;
TM
——————–
09-06 PM TZ +06:00

Використання з іншими типами даних

У висновку, наведемо таблицю операцій, які мені вдалося виявити над типом даних TIME.

Лістинг 4






















Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*


Аргумент 1

Оператор

Аргумент 2

Результат

TIME

TIME

DSINTERVAL

TIME

+

DSINTERVAL

TIME

TIME

DSINTERVAL

TIME