| Каталог | Индекс раздела |
| Назад | Оглавление | Вперед |
Типы данных, связанные с датой и временем, существенно различаются для двух наших СУБД, поэтому мы посвящаем им отдельный раздел, рассматривая в нем не только объявления этих типов, но и операции над ними.
Хотя дата и время могут представляться в виде чисел или символьных строк, они не являются числами или символьными строками, а представляют собой отдельный тип данных. В представлении даты и времени и в работе с этими типами данных две рассматриваемые нами СУБД существенно различаются (DB2 ближе к общепринятым формам, Oracle основывается на собственных оригинальных концепциях).
Стандартом предусматриваются следующие типы данных, связанные с датой и временем:
DATE - дата
TIME - время
TIMESTAMP - дата и время
INTERVAL - временной интервал
В DB2 для представления даты и времени имеются следующие типы данных:
DATE - значение, состоящее из трех частей (год, месяц, день). Допустимые значения даты - в пределах от 1 января 0001 г. до 31 декабря 9999 г.
TIME - значение, состоящее из трех частей (часы, минуты, секунды). Допустимые значения для часов - от 0 до 24, для двух других частей - от 0 до 59. Если часы установлены в 24, то минуты и секунды могут быть только 0.
TIMESTAMP - значение, состоящее из трех частей (год, месяц, день, часы, минуты, секунды, микросекунды). Допустимые значения для микросекунд - от 0 до 999999.
Данные типов дата/время могут увеличиваться, уменьшаться и вычитаться. Разность двух дат является десятичным значением, называемым длительностью. Длительности являются числовыми представлениями временных интервалов. Различаются 4 типа длительностей:
YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/MICROSECOND (перечисленные названия могут употребляться также и во множественном числе);
DECIMAL(8,0) в формате yyyymmdd.;
DECIMAL(6,0) в формате hhmmss.;
DECIMAL(20,6) в формате yyyymmddhhmmss.zzzzzz.
Константы даты/времени
Константы даты/времени записываются в виде строковых констант определенного формата.
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 - имеет один аргумент и возвращает внутреннее представление даты. Аргументом функции может быть:
yyyynnn', где yyyy - год, nnn - порядковый номер дня в году.
Функция приведения к типу времени - TIME - имеет один аргумент и возвращает внутреннее представление времени. Аргументом функции может быть:
Функция приведения к типу временного штампа - TIMESTAMP - может иметь один или два аргумента и возвращает внутреннее представление временного штампа.
Если задан один аргумент, то им может быть:
yyyyxxddhhmmss', где yyyy - год, xx - месяц, dd - день, hh - часы, mm - минуты, ss - секунды (микросекунды принимаются - 0).
Если задан один аргумент, то им может быть заданы два аргумента, то:
DATE;
TIME;
Данные типа даты/времени могут быть приведены к типу 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
В 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_TERRITORY - название территории (America, France, Japan, Russian, ...) ;
NLS_CURRENCY - название национальной валюты;
NLS_CALENDAR - название календаря (по умолчанию используется Григорианский календарь);
NLS_DATE_LANGUAGE - написание дней недели и месяцев;
NLS_DATE_FORMAT - формат даты по умолчанию (значение данного спецификатора по умолчанию определяется NLS_TERRITORY).
Далее мы подробно рассматриваем параметр NLS_DATE_FORMAT, как имеющий наиболее непосредственное отношение к нашей теме. Остальные параметры описаны в [8].
Значение спецификатора NLS_DATE_FORMAT (как и всех других NLS-спецификаторов) может задаваться в файле конфигурации или в операторе ALTER SESSION:
ALTER SESSION SET
NLS_DATE_FORMAT = <маска представления даты>
<маска представления даты> представляет собой строковую константу, задающую правила преобразования. Некоторые из спецификаций преобразования даты в строку или наоборот, которые она может содержать, следующие:
Y, YY, YYY, YYYY - последние 1- 4 цифры года;
MM - номер месяца;
MON - 3-буквенная аббревиатура названия месяца;
MONTH - полное название месяца;
D - номер дня недели;
DAY - название дня недели;
DY - сокращенное название дня недели;
DD - номер дня в месяце;
DDD - номер дня в году;
HH, HH12 - часы (1 - 12);
HH24 - часы (1 - 24);
/ , . ; :
Для добавления строковых констант к дате, строковая константа заключается в двойные кавычки, а все выражение - в одиночные кавычки, например:
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. Эта функция возвращает значение даты и времени и может иметь от одного до трех параметров:
CHAR или VARCHAR2 - строковое представление даты;
NLS_DATE_FORMAT;
Преобразование типа DATE в тип CHAR выполняется функцией TO_CHAR. Эта функция возвращает символьное представление даты и времени и может иметь от одного до трех параметров:
DATE;
Арифметика даты и времени
Данные типа DATE могут быть операндами операций увеличения, уменьшения и вычитания.
В операциях увеличения и уменьшения тип первого операнда - DATE, тип второго операнда - NUMBER. Тип результата - DATE.
В операции вычитания оба операнда должны иметь тип DATE, результат имеет тип NUMBER.
Число типа NUMBER в арифметике даты и времени интерпретируется как количество дней. Дробная часть числа - дробные части дня, то есть, часы, минуты, секунды. Некоторые функции Oracle обеспечивают дополнительную поддержку арифметики даты и времени:
ADD_MONTHS(d,n) - возвращает дату d плюс n месяцев (n может быть только целым);
MONTHS_BETWEEN(d1,d2) - возвращает, количество месяцев между датами d1 и d2 (возможно, с дробной частью);
LAST_DAY(d) - возвращает дату последнего дня того месяца, к которому относится дата d;
NEXT_DAY(d,c) - возвращает дату, соответствующую следующему появлению дня недели, заданного текстовым значением c, после даты d;
ROUND(d,fmt) - возвращает дату, округленную до формата, заданного вторым (необязательным) параметром;
TRUNC(d,fmt) - возвращает дату, усеченную до формата, заданного вторым (необязательным) параметром.
| Назад | Оглавление | Вперед |
| Каталог | Индекс раздела |