Вход/Регистрация
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
вернуться

Борри Хелен

Шрифт:

* Тем не менее ничто не теряется. Вы можете получить дату и время сервера с десятитысячными долями секунды, используя UDF GetExactTimestamp (...) из библиотеки UDF Firebird. Более подробную информацию см. в приложении 1.

Неявное преобразование типов в литералах даты и времени

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

Например, совершенно верным является затребовать, чтобы запрос SELECT вернул константу, которая не связана ни с каким столбцом в базе данных. Основное "хакерство" в Firebird- использование системной таблицы RDB$DATABASE в запросе, поскольку эта таблица имеет одну и только одну строку, и всегда можно получить скалярное значение: единственное контекстное значение от сервера. Следующие два примера иллюстрируют типичное использование этого приема:

SELECT 'NOW' FROM RDB$DATABASE;

Так как запрос возвращает константу, а не значение столбца, ее тип данных интерпретируется как CHAR(3), 'NOW'. Этот пример

SELECT '2.09.2004' FROM RDB$DATABASE;

вернет CHAR(9), '2.09.2004'.

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

* для диалекта 3:

SELECT CAST('NOW' AS TIMESTAMP) FROM RDB$DATABASE;

SELECT CAST('2.09.2004' AS TIMESTAMP) FROM RDB$DATABASE;

* для диалекта 1:

SELECT CAST('NOW' AS DATE) FROM RDB$DATABASE;

SELECT CAST('2.09.2004' AS DATE) FROM RDB$DATABASE;

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

Контекстные переменные даты и времени CURRENT_DATE, CURRENT_TIME и CURRENT_TIMESTAMP возвращают значение даты и времени, полученные с сервера на момент начала выполнения оператора SQL, содержащего контекстную переменную. Табл. 10.6 описывает эти переменные.

Таблица 10.6. Контекстные переменные даты и времени

Переменная

Тип диалекта 3

Тип диалекта 1

Значение

CORRENT_TIMESTAMP

TIMESTAMP

DATE

Текущая дата и время, округленное до секунд. Дробная часть секунд всегда возвращается равной '.0000'

CURRENT_DATE

DATE

Не поддерживается

Текущая дата

CURRENT_TIME

TIME

Не поддерживается

Текущее время, выраженное в часах, минутах и секундах после полуночи. Дробная часть секунд всегда возвращается равной ' .0000'

Операции, использующие значения даты и времени

Использование арифметических операций в манипулировании данными, в вычислениях и в отношениях между двумя датами были ранее рассмотрены в разд. "Интервал времени" этой главы. Возможность вычитания значения более ранней даты, времени или даты-времени из более поздней существует благодаря способу хранения типов дата и время в Firebird. Способ хранения использует одно или два 32-битовых целых для даты/времени, только для даты или только для времени дня. Данные, представленные в этих числах, являются днями в длинном слове даты и дробной частью дней в слове времени. Дата представлена количеством дней с "нулевой даты"- 17 ноября 1898 г [26] . Время представлено в десятитысячных долях секунд, прошедших с полуночи.

26

Вероятно, не будет ошибкой, если эта дата дает целое значение, называемое Измененным юлианским номером дня. Подробности см. на http://hermetic.nofadz.com/cal_stud/jdn.htm.

В диалекте 3 DATE хранит только дату. В диалекте 3 TIME хранит только время. TIMESTAMP и в диалекте 1 DATE хранят обе части.

С этими числовыми структурами можно довольно просто оперировать, используя несложные выражения сложения и вычитания для вычисления разницы во времени (интервал), увеличения или уменьшения дат, установления диапазонов даты или времени. В табл. 10.7 описываются доступные операции и получаемые результаты.

Таблица 10.7. Арифметические операции для типов данных даты и времени

Операнд 1

Оператор

Операнд 2

Результат

DATE

+

TIME

TIMESTAMP (арифметическая конкатенация)

DATE

+

Числовое значение n**

DATE, увеличенная на n целых дней (игнорируется дробная часть n, если указана)

TIME

+

DATE

TIMESTAMP (арифметическая конкатенация)

TIME

+

Числовое значение n**

TIME, увеличенное на n секунд*

TIMESTAMP

+

Числовое значение n**

TIMESTAMP, где дни увеличены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64 x 10(^5^))

DATE

–

DATE

Количество дней в интервале: DECIMAL(9,0)

DATE

–

Числовое значение N**

DATE, уменьшенная на n дней (игнорируется дробная часть n, если указана)

TIME

–

TIME

Количество секунд в интервале: DECIMAL(9,4)

TIME

–

Числовое значение n**

TIME, уменьшенное на n секунд*

TIMESTAMP

–

TIMESTAMP

Количество дней и части дня в интервале: DECIMAL (18, 9)

TIMESTAMP

–

Числовое значение n**

TIMESTAMP, где дни уменьшены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64x10(^5^))

* При необходимости повторяется (result=modulo(result, (24*60*60))) пока не будет выделена результирующая часть дней.

** В диалекте 3 для типа DATE n является целым, представляющим количество дней. Для типов данных TIMESTAMP и для диалекта 1 DATE n может быть числом, представляющим количество дней слева от десятичной точки (целая часть) и части дня справа от десятичной точки (дробная часть). Для типа TIME n является целым числом, представляющим количество секунд.

  • Читать дальше
  • 1
  • ...
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: