Читаем Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ полностью

<p>Использование CAST() с типами дата/время</p>

В некоторых местах этой главы вы встречали функцию CAST() в выражениях, содержащих типы данных даты и литералы даты. В настоящем разделе рассматриваются различные аспекты преобразования даты и времени более широко и подробно.

<p>Преобразование между типами дата/время</p>

Обычно преобразование из одного типа дата/время в другой возможно, если исходный тип дата/время содержит подходящий вид данных для помещения в выходной тип дата/время. Например, TIMESTAMP содержит данные, которые можно преобразовать в тип только даты DATE или только время TIME, В то время как тип TIME не содержит достаточно данных для преобразования в тип DATE. Firebird предоставляет возможность преобразовывать тип DATE В TIMESTAMP, присваивая времени значение полночи, и тип TIME в TIMESTAMP, выбирая дату из контекстной переменной CURRENT_DATE (серверное время). В табл. 10.9 представлены правила преобразования.

Таблица 10.9. Преобразования между типами дата/время в диалекте 3

Исходный тип

В тип TIMESTAMP

В тип DATE

В тип TIME

TIMESTAMP

Недоступно

Да, преобразует дату, игнорируя время

Да, преобразует время, игнорируя дату

DATE

Да, время устанавливается в значение полночи

Недоступно

Нет

TIME

Да, дате присваивается значение CURRENT_DATE

Нет

Недоступно

DATE + TIME

Да, CAST ( (DATEFIELD + TIMEFIELD AS TIMESTAMP)

Нет

Нет

<p>Преобразование типов даты в CHAR(n) и VARCHAR(n)</p>

Используйте в операторах SQL-функцию CAST() для трансляции данных даты и времени в символьные типы данных.

Firebird преобразует типы дата и время в форматированные строки, в которых дата (если присутствует) представлена в установленном формате - в зависимости от диалекта - а время представлено в стандартном для Firebird формате: HH:MM:ss.nnnn. Необходимо использовать столбец, переменную типа CHAR или VARCHAR подходящего размера для получения желаемого вами результата.

Преобразование типов дата/время можно выполнять в оба строковых типа фиксированной длины CHAR и переменной длины VARCHAR. Поскольку размер преобразуемой строки заранее известен, CHAR имеет небольшое преимущество перед VARCHAR: использование CHAR при передаче по сети сэкономит вам два байта, которые добавляются к VARCHAR для хранения размера. "Правильный размер" зависит от диалекта, обратите на это внимание, VARCHAR может быть более подходящим при использовании в коде приложения, которое может обрабатывать оба диалекта.

Если символьное поле слишком мало для результата, то появится исключение переполнения. Пусть, вам нужно получить строку, содержащую только дату из TIMESTAMP. Использование для этого символьного контейнера меньшего размера не будет работать - CAST() не обрезает выходную строку. Необходимо выполнить двойное преобразование: вначале преобразование TIMESTAMP в DATE, а затем преобразование даты в символьный тип корректного размера - см. примеры в следующем разделе.

Диалект 3

Преобразование DATE или TIMESTAMP создает дату в формате ISO (CCYY-MM-DD). Полная длина выходной строки 10 символов для DATE и 11 - для TIMESTAMP (дата и один пробел перед временем). Нужно 13 символов для TIME или для времени в TIMESTAMP.

Например, выражение

SELECT CAST(timestamp_col as CHAR(24)) AS TstampTxt FROM RDB$DATABASE;

даст строку вроде следующей:

2004-06-25 12:15:45.2345

Это выдаст исключение переполнения:

SELECT CAST (timestamp_col as CHAR(20)) AS TstampTxt FROM RDB$DATABASE;

Двойное преобразование создает правильную строку:

SELECT FIRST 1 CAST (

CAST (timestamp_col AS DATE) AS CHAR(10)) FROM Table1;

Результатом будет:

2004-06-25

К сожалению, нет возможности путем прямого преобразования получить строку, содержащую дату плюс время без дробных долей секунды. Это может быть выполнено с использованием сложного выражения, включающего функции CAST() и EXTRACT(). Пример см. в одном из следующих подразделов разд. "Функция EXTRACT()".

Диалект 1

Дата в типе данных DATE диалекта 1 преобразуется в формат DD-MMM-CCYY, а не В формат ISO, как в диалекте 3. Например, вот это

SELECT CAST(dldate_col as CHAR(25)) AS DateTimeTxt FROM RDB$DATABASE;

даст

26-JUN-2004 12:15:45.2345

Следовательно, преобразование дат в диалекте 1 требует 11 символов вместо 10 плюс 1 символ пробела плюс 13 для времени - всего 25.

Более сложные выражения

Преобразование может использовать более сложные выражения в комбинации с другими выражениями, например:

SELECT CAST (10 + CAST(('TODAY') AS DATE) AS CHAR(25)) TEXTTIME FROM RDB$DATABASE;

или

SELECT CAST (10 + CURRENT_TIMESTAMP) AS DATE) AS CHAR(25)) TEXTTIME FROM RDB$DATABASE;

возвращает текстовую строку, показывающую дату на 10 дней позже текущей даты.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных