Не существует типа "только дата" в диалекте 1. Для сохранения в диалекте 1 только даты, передайте правильное значение даты и литерал времени в виде "00:00:00.0000". Литералы даты и времени обсуждаются более подробно в следующих разделах.
! ! !
СОВЕТ. Если вы используете isql для проверки дат диалекта 1, вы можете включать/выключать отображение времени при выводе даты, используя команду isql SET TIME. По умолчанию вывод времени отключен.
. ! .
Тип данных TIMESTAMP диалекта 3 состоит из двух 32-битовых слов, хранящих дату и время. Данные хранятся как два 32-битовых целых, что эквивалентно типу DATE в диалекте 1.
Доли секунды, если хранятся, являются десятитысячными долями секунды для всех типов даты и времени.
В диалекте 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));
Литералы даты являются "читаемыми человеком" строками, заключенными в апострофы. Их сервер Firebird распознает как константы даты или даты-и-времени для EXTRACT и других выражений, операций INSERT и UPDATE, а также в предложении WHERE оператора SELECT.
Литералы даты используются, когда нужно передать константы даты:
* операторам SELECT, UPDATE и DELETE в условия поиска предложения WHERE;
* операторам INSERT и UPDATE для ввода констант даты и времени;
* аргументу FROM функции EXTRACT().
Количество форматов строк, распознаваемых как литералы даты, ограничено. Эти форматы используют шаблоны для подстановки элементов строк. Табл. 10.1 описывает используемые соглашения.
Таблица 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. Распознаваемые форматы литералов даты и времени