КаталогИндекс раздела
НазадОглавлениеВперед


2.3 Дата и время

Типы данных, связанные с датой и временем, существенно различаются для двух наших СУБД, поэтому мы посвящаем им отдельный раздел, рассматривая в нем не только объявления этих типов, но и операции над ними.

Хотя дата и время могут представляться в виде чисел или символьных строк, они не являются числами или символьными строками, а представляют собой отдельный тип данных. В представлении даты и времени и в работе с этими типами данных две рассматриваемые нами СУБД существенно различаются (DB2 ближе к общепринятым формам, Oracle основывается на собственных оригинальных концепциях).

Стандартом предусматриваются следующие типы данных, связанные с датой и временем:

2.3.1 Дата и время в DB2

В DB2 для представления даты и времени имеются следующие типы данных:

Данные типов дата/время могут увеличиваться, уменьшаться и вычитаться. Разность двух дат является десятичным значением, называемым длительностью. Длительности являются числовыми представлениями временных интервалов. Различаются 4 типа длительностей:

Константы даты/времени

Константы даты/времени записываются в виде строковых констант определенного формата.

DB2 поддерживает 5 вариантов формата представления даты:

Название Обозначение Формат Пример
(3 марта 2002 г.)
Международная Организация Стандартов ISO yyyy-mm-dd 2002-03-21
Стандарт IBM для США USA mm/dd/yyyy 03/21/2002
Стандарт IBM для Европы EUR dd.mm.yyyy 21.03.2002
Промышленный стандарт Японии JIS yyyy-mm-dd 2002-03-21
Локальное представление LOC Зависит от установленного кода страны

DB2 поддерживает также 5 вариантов формата представления времени:

Название Обозна-чение Формат Пример
(13 час 9 мин 30 сек)
Международная Организация Стандартов ISO hh.mm.ss 13.09.30
Стандарт IBM для США USA hh.mm AM или PM 1:09 PM
Стандарт IBM для Европы EUR hh.mm.ss 13.09.30
Промышленный стандарт Японии JIS hh:mm:ss 13:09:30
Локальное представление LOC Зависит от установленного кода страны

Формат представления даты/времени устанавливается при подготовке приложения или пакета, работающего с базой данных. По умолчанию принимается формат LOC. Аббревиатура формата может также являться параметром функций преобразования типов.

Ниже приведен пример вывода даты и времени в различных форматах:

SELECT DISTINCT current date AS DLOC,
                CHAR(current date,ISO) AS DISO,
                CHAR(current date,USA) AS DUSA,
                CHAR(current date,EUR) AS DEUR,
                CHAR(current date,JIS) AS DJIS,
        FROM job;

DLOC       DISO       DUSA       DEUR       DJIS       
---------- ---------- ---------- ---------- -----
07/09/2001 2001-09-07 09/07/2001 07.09.2001 2001-09-07 

SELECT DISTINCT current time AS DLOC,
                CHAR(current time,ISO) AS TISO,
                CHAR(current time,USA) AS TUSA,
                CHAR(current time,EUR) AS TEUR,
                CHAR(current time,JIS) AS TJIS
        from job;

DLOC     TISO     TUSA     TEUR        TJIS    
-------- -------- -------- --------    --------
11.15.50 11.15.50 11:15 AM 11.15.50 11:15:50

Представление типа TIMESTAMP не поддается форматированию и всегда представляется в виде: yyyy-mm-dd-hh.mm.ss.xxxxxx, например:

    2001-09-07-11.15.50.360001

Специальные регистры

Специальные регистры CURRENT TIME, CURRENT DATE, CURRENT TIMESTAMP содержат текущее значение даты/времени, обновляемое во время выполнения на сервере SQL-оператора, обращающегося к этим регистрам (см. предыдущий пример).

Специальный регистр CURRENT TIMEZONE содержит разность между локальным временем на сервере и универсальным временем UTC (время по Гринвичу). Разность представляется в виде шестизначного десятичного числа (длительность времени).

Преобразование типов

Функция приведения к типу даты - DATE - имеет один аргумент и возвращает внутреннее представление даты. Аргументом функции может быть:

Функция приведения к типу времени - TIME - имеет один аргумент и возвращает внутреннее представление времени. Аргументом функции может быть:

Функция приведения к типу временного штампа - TIMESTAMP - может иметь один или два аргумента и возвращает внутреннее представление временного штампа.

Если задан один аргумент, то им может быть:

Если задан один аргумент, то им может быть заданы два аргумента, то:

Данные типа даты/времени могут быть приведены к типу CHAR или VARCHAR при помощи функции CHAR. Эта функция может употребляться с одним или с двумя аргументами. В любом случае тип первого аргумента - DATE, TIME или TIMESTAMP, этот аргумент задает преобразуемое значение. Второй (необязательный) аргумент - аббревиатура формата представления даты/времени. Если тип первого аргумента - TIMESTAMP, то второй аргумент задавать нельзя. Функция возвращает строковое представление даты/времени/временного штампа в соответствии с заданным форматом (или с форматом по умолчанию, если второй аргумент не задан).

Некоторые функции, работающие с датой и временем

YEAR, MONTH, DAY - возвращают целое число, год, месяц или день в представлении даты. Все три вышеприведенные функции имеют один аргумент, который может быть датой или временным штампом или их корректным символьным представлением, длительностью даты или длительностью временного штампа.

HOUR, MINUTE, SECOND, MICROSECOND - возвращают целое число, часы, минуты, секунды или микросекунды в представлении времени. Первые три функции имеют один аргумент, который может быть временем или временным штампом или их корректным символьным представлением, длительностью времени или длительностью временного штампа. Аргументом функции MICROSECOND может быть только временной штамп или длительность временного штампа.

DAYNAME, MONTHNAME - возвращают текстовое наименование дня недели или месяца - VARCHAR(100). Аргументом обеих функций является дата или временной штамп или их корректное символьное представление.

DAYOFWEEK, DAYOFYEAR, WEEK - возвращают целое число, номер дня недели, номер дня в году, номер недели в году. Аргументом функций является дата или временной штамп или их корректное символьное представление.

Арифметика даты/времени

Данные типов дата/время/временной штамп могут быть операндами операций увеличения, уменьшения и вычитания.

В операциях увеличения и уменьшения тип первого операнда - дата/время/временной штамп (или их корректное символьное представление), тип второго операнда - именованная длительность или длительность типа, соответствующая первому операнду. Тип результата совпадает с типом первого операнда.

В операции вычитания оба операнда должны иметь одинаковый тип даты/времени/временного штампа, результат имеет тип соответствующей длительности.

Чрезвычайно удобным свойством DB2 является возможность использования именованных временных единиц в арифметике даты, например:

    some_date + 3  years + 2  monthes + 15 days

2.3.2 Дата и время в Oracle

В Oracle имеется единый тип данных DATE, хранящей для каждой величины, представленной в этом типе, значение года, месяца, дня, часов, минут и секунд. Дата и время также могут храниться в форматах CHAR и NUMBER, допускающих преобразование к типу DATE с помощью функции TO_DATE.

Функция без параметров SYSDATE возвращает текущее значение даты и времени.

Константы даты/времени и формат представления даты

Внешнее представление даты и времени - символьная константа, преобразование которой во внутреннее представление определяется форматом, заданным в NLS_DATE_FORMAT.

Спецификаторы NLS (National Language Support - поддержка национальных языков) позволяют пользователю работать в среде с локализованными средами окружения. Они определяют многие значения по умолчанию. От спецификаторов NLS, определяющих соглашения на среду окружения, зависят принимаемые по умолчанию аргументы ряда функций Oracle SQL, в том числе - функций TO_CHAR, TO_DATE, TO_NUMBER.

В имеющийся набор спецификаторов NLS входят, например:

Далее мы подробно рассматриваем параметр NLS_DATE_FORMAT, как имеющий наиболее непосредственное отношение к нашей теме. Остальные параметры описаны в [8].

Значение спецификатора NLS_DATE_FORMAT (как и всех других NLS-спецификаторов) может задаваться в файле конфигурации или в операторе ALTER SESSION:

    ALTER SESSION SET 
       NLS_DATE_FORMAT = <маска представления даты>

<маска представления даты> представляет собой строковую константу, задающую правила преобразования. Некоторые из спецификаций преобразования даты в строку или наоборот, которые она может содержать, следующие:

Для добавления строковых констант к дате, строковая константа заключается в двойные кавычки, а все выражение - в одиночные кавычки, например:

SQL> ALTER SESSION SET NLS_DATE_FORMAT = '"Today is" DD/MM/YYYY';
Session altered.
SQL> SELECT SYSDATE FROM dual;
SYSDATE
-------------------
Today is 10/09/2001

Преобразование типов

Преобразование символьной строки к типу DATE выполняется функцией TO_DATE. Эта функция возвращает значение даты и времени и может иметь от одного до трех параметров:

Преобразование типа DATE в тип CHAR выполняется функцией TO_CHAR. Эта функция возвращает символьное представление даты и времени и может иметь от одного до трех параметров:

Арифметика даты и времени

Данные типа DATE могут быть операндами операций увеличения, уменьшения и вычитания.

В операциях увеличения и уменьшения тип первого операнда - DATE, тип второго операнда - NUMBER. Тип результата - DATE.

В операции вычитания оба операнда должны иметь тип DATE, результат имеет тип NUMBER.

Число типа NUMBER в арифметике даты и времени интерпретируется как количество дней. Дробная часть числа - дробные части дня, то есть, часы, минуты, секунды. Некоторые функции Oracle обеспечивают дополнительную поддержку арифметики даты и времени:


НазадОглавлениеВперед
КаталогИндекс раздела