Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
CHECK (TOTAL_VALUE >= 0),
DISCOUNT FLOAT
DEFAULT 0
CHECK (DISCOUNT >= 0 AND DISCOUNT <= 1));
В следующей главе мы рассмотрим типы данных для хранения и обработки дат и времени в Firebird.
ГЛАВА 10. Типы даты и времени.
Firebird поддерживает в диалекте 3 типы данных DATE, TIME и TIMESTAMP. В диалекте 1 поддерживается только один тип данных, подобный TIMESTAMP, который, хотя и называется DATE, не является взаимозаменяемым с типом DATE диалекта 3.
DATE
В диалекте 3 DATE хранит одну дату без времени - тип "только дата" - в виде 32-битового знакового целого. Хранимый диапазон дат от 1 января 0001 года до 31 декабря 9999 года [24] .
В
24
Так в оригинале. В документации по InterBase указан диапазон дат от 1 января 100 г. до 29 февраля 32 768 г.
– Прим. перев.
Не существует типа "только дата" в диалекте 1. Для сохранения в диалекте 1 только даты, передайте правильное значение даты и литерал времени в виде "00:00:00.0000". Литералы даты и времени обсуждаются более подробно в следующих разделах.
! ! !
СОВЕТ. Если вы используете isql для проверки дат диалекта 1, вы можете включать/выключать отображение времени при выводе даты, используя команду isql SET TIME. По умолчанию вывод времени отключен.
. ! .
TIMESTAMP
Тип данных TIMESTAMP диалекта 3 состоит из двух 32-битовых слов, хранящих дату и время. Данные хранятся как два 32-битовых целых, что эквивалентно типу DATE в диалекте 1.
Доли секунды
Доли секунды, если хранятся, являются десятитысячными долями секунды для всех типов даты и времени.
TIME
В диалекте 3 TIME хранит время дня без даты: "только время". Для хранения используется 32-битовое беззнаковое целое. Диапазон времени от 00:00 до 23:59:59.9999.
В диалекте 1 нет эквивалента типу TIME. Если нужно сохранить время дня, выделите элементы часов, минут и секунд из данных DATE и преобразуйте в строку. Технические советы есть дальше в этой главе - обратитесь к разд. "Комбинирование EXTRACT с другими функциями".
Интервал времени
Ошибочно предполагать, что тип TIME может хранить интервал времени. Он не может. Для вычисления интервала времени вычтите более позднюю дату или время из более раннего. Результатом будет число NUMERIC(18,9), выражающее интервал в днях. Поскольку точность теряется, доли секунд надо рассматривать как миллисекунды, а не десятитысячные доли секунд. Используйте обычные арифметические операции для конвертирования дней в часы, минуты или секунды, как вам требуется.
Предположим, что столбцы STARTED и FINISHED имеют тип TIMESTAMP (DATE В диалекте 1). Для вычисления и сохранения в столбце TIME_ELAPSED типа DOUBLE PRECISION интервала времени в минутах вы можете использовать следующее [25] :
UPDATE ATABLE
SET TIME_ELAPSED = (FINISHED - STARTED) * 24 * 60
WHERE ((FINISHED IS NOT NULL) AND (STARTED IS NOT NULL));
Литералы даты
25
Для того чтобы осуществлять агрегацию интервала (суммирование, среднее), необходимо хранить не время окончания интервала, а его длительность, например в секундах, в обычном целочисленном типе данных.
– Прим. науч. ред.
Литералы даты являются "читаемыми человеком" строками, заключенными в апострофы. Их сервер Firebird распознает как константы даты или даты-и-времени для EXTRACT и других выражений, операций INSERT и UPDATE, а также в предложении WHERE оператора SELECT.
Литералы даты используются, когда нужно передать константы даты:
* операторам SELECT, UPDATE и DELETE в условия поиска предложения WHERE;
* операторам INSERT и UPDATE для ввода констант даты и времени;
* аргументу FROM функции EXTRACT.
Распознаваемые форматы литералов даты и времени
Количество форматов строк, распознаваемых как литералы даты, ограничено. Эти форматы используют шаблоны для подстановки элементов строк.
Таблица 10.1. Элементы литералов даты
Элемент | Представление |
CC | Столетие. Первые две цифры года (например, 20 для двадцать первого века) |
YY | Год столетия. Firebird всегда сохраняет полное значение года, даже если год был введен без сегмента cc, при этом используется алгоритм "скользящего окна" для определения того, какое столетие сохранять |
MM | Месяц- целое в диапазоне от 1 до 12. В некоторых форматах требуется две цифры |
MMM | Месяц - один из [JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC] . Также допустимы полные английские названия месяцев |
DD | День месяца- целое в диапазоне от 1 до 31. В некоторых форматах требуется две цифры. Неверное значение дня для конкретного месяца вызывает ошибку |
HH | Часы - целое в диапазоне от 00 до 23. Требуются две цифры |
NN | Минуты - целое в диапазоне от 00 до 59. Требуются две цифры |
SS | Полные секунды - целое в диапазоне от 00 до 59. Требуются две цифры |
nnnn | Десятитысячные доли секунды в диапазоне от 0 до 9999. Значение по умолчанию 0000. Если используется, то требуется четыре цифры |
Распознаваемые форматы описаны в табл. 10.2.
Таблица 10.2. Распознаваемые форматы литералов даты и времени
Формат | Диалект 3 DATE | Диалект 3 TIMESTAMP | DATE |
' CCYY-MM-DD' или 'YY-MM-DD' | Сохраняет только дату | Сохраняет дату и время в виде 00:00:00 | Сохраняет дату и время в.виде 00:00:00 |
'MM/DD/CCYY' или 'MM/DD/YY' | То же | То же | То же |
'DD.MM.CCYY' или 'DD.MM.YY' | То же | То же | То же |
' DD-MMM-CCYY' или 'DD-MMM-YY' | То же | То же | То же |
'DD,MMM,CCYY' или ' DD,MMM,YY' | То же | То же | То же |
'DD MMM CCYY' или 'DD MMM YY' | To же | То же | То же |
'DDMMMCCYY' или 'DDMMMYY' | To же | То же | То же |
В элементе MMM также допустимы полные английские названия месяцев, нечувствительные к регистру. Правильные названия приведены в табл. 10.3
'CCYY-MM-DD HH:NN:SS.nnnn' или 'YY-MM-DD HH:NN:SS.nnnn' (элемент ".nnnn" необязателен) | Сохраняет только дату; может потребовать преобразования для даты. Время не сохраняется | Сохраняет дату и время | Сохраняет дату и время |
'MM/DD/CCYYHH:NN:SS.nnnn' или 'MM/DD/YY HH:NN:SS.nnnn' | То же | То же | То же |
' DD.MM.CCYYHH:NN:SS.nnnn' или 'DD.MM.YY HH:NN:SS.nnnn' | То же | То же | То же |
'DD-MMM-CCYY HH:NN:SS.nnnn' или 'DD-MMMYY HH:NN:SS.nnnn' | То же | То же | То же |