Справочник по управляющим последовательностям ODBC для Firebird и InterBase (ODBC Escape Sequences).
Что такое управляющие последовательности (ODBC Escape Sequences)?
Управляющие последовательности (Escape Sequences) входят в стандарт ODBC и предназначены для решения проблем совместимости SQL для различных серверов баз данных.
В отличие от MS SQL Server, в Firebird и InterBase нет встроенной поддержки управляющих последовательностей, поэтому мы решили добавить их в IBProvider, чтобы дать возможность пользователям этих серверов писать SQL запросы, легко переносимые между различными серверами баз данных. Изначально последовательности были реализованы в ODBC драйверах, но впоследствии они перекочевали в OLE DB и были добавлены в Microsoft OLE DB Provider для SQL Server, в IBProvider и во многие другие OLE DB драйвера, которые постепенно вытеснили узкоспециализированную ODBC технологию более универсальной — OLE DB.
Управляющие последовательности заключаются в фигурные скобки {escape sequence}.
Для включения ODBC парсера в IBProvider в строку подключения необходимо добавить параметр support_odbc_query = true.
Зачем использовать ODBC Escape Sequences?
Некоторые возможности SQL, такие как вызов скалярных функций или хранимых процедур, часто в различных серверах баз данных реализованы различными способами. Для решения проблемы совместимости SQL в рамках стандарта ODBC были разработаны управляющие последовательности (ODBC Escape Sequences).
Для первого примера возьмем операцию сложения строк. В Firebird и Oracle конкатенация строк реализована при помощи операции ||, а в MS SQL Server при помощи операции +. Для того, чтобы ваш запрос был совместим с различными серверами, его необходимо привести к стандартному виду.
Конкатенация в MS SQL:
SELECT (first_name + ‘ ‘ + last_name) as name FROM employee |
Конкатенация в Firebird и Oracle:
SELECT (first_name || ‘ ‘ || last_name) FROM employee |
Запрос, записанный с применением управляющих последовательностей, будет работать в любых серверах с поддержкой ODBC Escape Sequences:
SELECT {fn concat (first_name, {fn concat (‘ ‘, last_name)})} FROM employee |
В качестве еще одного примера подойдет реализация функций работы с датой и временем. Могут различаться дни, которые принимаются в качестве начала недели, реализации подсчета номера недели при переходе через год (функция WEEK), а так же многие другие параметры, которые при отсутствии стандартного подхода могут привести к неправильной работе приложения при смене сервера баз данных.
Не стоит думать, что такие задачи как работа с датой и временем, вызов скалярных функций отличаются только для серверов баз данных различных производителей (Oracle, Firebird, MS SQL). В рамках одного сервера могут так же наблюдаться различия между несколькими версиями. Но использование управляющих последовательностей ODBC должно защитить вас от несоответствий. Собственно для этого и был разработан этот стандарт.
В IBProvider три задачи приведены к стандартному синтаксису ODBC Escape Sequences:
- определение даты и времени;
- вызов хранимых процедур;
- вызов встроенных функций;
Где используются ODBC Escape Sequences?
- В MS SQL Server Management Studio для написания унифицированных запросов к связным серверам (Linked Server).
- В MS SQL Server Analysis Services при выполнении различных математических расчетов, а так же получении срезов по различным временным интервалам.
- В Crystal Reports и Reporting Services (SSRS) для разработки отчетов, не зависящих от сервера баз данных.
- В приложениях, которые должны быть независимы от особенностей реализации SQL в различных серверах баз данных.
Последовательности определения даты и времени (Date, Time, Timestamp Escape Sequences).
| Название последовательности | Синтаксис |
|---|---|
| Дата | {d ‘yyyy-mm-dd’} |
| Время | {t ‘hh:mm:ss’} |
| Временная метка (Timestamp) | {ts ‘yyyy-mm-dd hh:mm:ss’} |
Пример обработки строки с датой через управляющую последовательность:
SELECT COUNT(id) AS cnt FROM employee WHERE hire_date > {d ‘2007-01-01’} |
В примере строка с датой записана в стандартном формате управляющей последовательности {d ‘yyyy-mm-dd’}, а далее она уже приводится к тому формату, в котором хранятся даты на конкретном сервере баз данных.
Последовательность для вызова хранимой процедуры (Procedure Call Escape Sequence).
Хранимые процедуры так же могут быть вызваны различными способами:
select * from sp_name exec sp_name(params) execute sp_name(params) |
Синтаксис вызова процедуры в ODBC стиле:
{[?=]call procedure-name[([parameter][,[parameter]]…)]}
|
Пример вызова хранимой процедуры в ODBC стиле в которой определяются 1 входной и 4 выходных именованных параметра:
{call SUB_TOT_BUDGET(:dept_head, :tot_b output, :avg_b output, :min_b output, :max_b output)};
|
Последовательность для вызова скалярных функций (Scalar Function Escape Sequence)
Синтаксис вызова скалярной функции:
SELECT {fn function(скалярные выражения, поля запроса)} FROM EMP |
Пример приведения строки к верхнему регистру с использованием управляющей последовательности {fn .. }:
SELECT {fn UCASE(NAME)} FROM EMP |
Какие функции поддерживаются моим сервером баз данных?
На момент написания статьи в IBProvider был реализована поддержка 69 ODBC функций для различных серверов.
Строковые функции
| Название функции | IB 4 | IB 5 | IB 6 | IB 6.5 | IB 7 | IB 7.1 | IB 7.5 | IB 2007 | FB 1 | FB 1.5 | FB 2 | FB 2.1 | YA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ASCII | + | + | |||||||||||
| BIT_LENGTH | + | + | |||||||||||
| CHAR | + | + | |||||||||||
| CHAR_LENGTH | + | + | + | ||||||||||
| CHARACTER_LENGTH | + | + | + | ||||||||||
| CONCAT | + | + | + | + | + | + | + | + | + | + | + | + | + |
| DIFFERENCE | |||||||||||||
| INSERT | + | + | |||||||||||
| LCASE | + | + | + | ||||||||||
| LEFT | + | + | + | + | + | ||||||||
| LENGTH | + | + | + | ||||||||||
| LOCATE | + | + | |||||||||||
| LTRIM | + | + | + | ||||||||||
| OCTET_LENGTH | + | + | |||||||||||
| POSITION | + | + | |||||||||||
| REPEAT | + | + | |||||||||||
| REPLACE | + | + | |||||||||||
| RIGHT | + | + | + | ||||||||||
| RTRIM | + | + | + | ||||||||||
| SOUNDEX | |||||||||||||
| SPACE | + | + | + | ||||||||||
| SUBSTRING | + | + | + | + | + | ||||||||
| UCASE | + | + | + | + | + | + | + | + | + | + | + | + | + |
Числовые функции
| Название функции | IB 4 | IB 5 | IB 6 | IB 6.5 | IB 7 | IB 7.1 | IB 7.5 | IB 2007 | FB 1 | FB 1.5 | FB 2 | FB 2.1 | YA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ABS | + | + | + | + | + | + | |||||||
| ACOS | + | + | |||||||||||
| ASIN | + | + | |||||||||||
| ATAN | + | + | |||||||||||
| ATAN2 | + | + | |||||||||||
| CEILING | + | + | |||||||||||
| COS | + | + | |||||||||||
| COT | + | + | |||||||||||
| DEGREES | + | + | + | + | + | + | + | + | + | + | + | + | + |
| EXP | + | + | |||||||||||
| FLOOR | + | + | |||||||||||
| LOG | + | + | |||||||||||
| LOG10 | + | + | |||||||||||
| MOD | + | + | |||||||||||
| PI | + | + | + | + | + | + | + | + | + | + | + | + | + |
| POWER | + | + | |||||||||||
| RADIANS | + | + | + | + | + | + | + | + | + | + | + | + | + |
| RAND | + | + | |||||||||||
| ROUND | + | + | |||||||||||
| SIGN | + | + | + | + | + | + | |||||||
| SIN | + | + | |||||||||||
| SQRT | + | + | |||||||||||
| TAN | + | + | |||||||||||
| TRUNCATE | + | + |
Функции даты и времени
| Название функции | IB 4 | IB 5 | IB 6 | IB 6.5 | IB 7 | IB 7.1 | IB 7.5 | IB 2007 | FB 1 | FB 1.5 | FB 2 | FB 2.1 | YA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CURRENT_DATE | + | + | + | + | + | + | + | + | + | + | + | + | + |
| CURRENT_TIME[см ниже] | + | + | + | + | + | + | + | + | + | + | + | ||
| CURRENT_TIMESTAMP | + | + | + | + | + | + | + | + | + | + | + | + | + |
| CURDATE | + | + | + | + | + | + | + | + | + | + | + | + | + |
| CURTIME | + | + | + | + | + | + | + | + | + | + | + | ||
| DAYNAME | + | + | + | + | + | + | + | + | + | + | + | ||
| DAYOFMONTH | + | + | + | + | + | + | + | + | + | + | + | ||
| DAYOFWEEK | + | + | + | + | + | + | + | + | + | + | + | ||
| DAYOFYEAR | + | + | + | + | + | + | + | + | + | + | + | ||
| EXTRACT | + | + | + | + | + | + | + | + | + | + | + | ||
| HOUR | + | + | + | + | + | + | + | + | + | + | + | ||
| MINUTE | + | + | + | + | + | + | + | + | + | + | + | ||
| MONTH | + | + | + | + | + | + | + | + | + | + | + | ||
| MONTHNAME | + | + | + | + | + | + | + | + | + | + | + | ||
| NOW | + | + | + | + | + | + | + | + | + | + | + | + | + |
| QUARTER | + | + | + | + | + | + | + | + | + | + | + | ||
| SECOND | + | + | + | + | + | + | + | + | + | + | + | ||
| TIMESTAMPADD | + | + | |||||||||||
| TIMESTAMPDIFF[см ниже] | + | ||||||||||||
| WEEK | + | ||||||||||||
| YEAR | + | + | + | + | + | + | + | + | + | + | + |
- Функция CURRENT_TIME доступна только для 2-го и 3-го диалектов.
- Для функции TIMESTAMPDIFF не поддерживаются значения интервала SQL_TSI_WEEK, SQL_TSI_QUARTER.
Системные функции
| Название функции | IB 4 | IB 5 | IB 6 | IB 6.5 | IB 7 | IB 7.1 | IB 7.5 | IB 2007 | FB 1 | FB 1.5 | FB 2 | FB 2.1 | YA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DATABASE | |||||||||||||
| IFNULL | + | + | + | + | + | + | |||||||
| USER | + | + | + | + | + | + | + | + | + | + | + | + | + |
Функции преобразования типов данных
| Название функции | IB 4 | IB 5 | IB 6 | IB 6.5 | IB 7 | IB 7.1 | IB 7.5 | IB 2007 | FB 1 | FB 1.5 | FB 2 | FB 2.1 | YA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CONVERT | + | + | + | + | + | + | + | + | + | + | + | + | + |
- Функция CONVERT поддерживает следующие типы данных: SQL_BIT, SQL_BIGINT, SQL_CHAR, SQL_DECIMAL, SQL_DOUBLE, SQL_FLOAT, SQL_INTEGER, SQL_LONGVARCHAR, SQL_NUMERIC, SQL_REAL, SQL_SMALLINT, SQL_DATE, SQL_TIME, SQL_TIMESTAMP, SQL_VARCHAR
- Типы SQL_BIGINT и SQL_TIME поддерживаются только во 2 и 3 диалекте.
- Тип SQL_LONGVARCHAR поддерживается, начиная с Firebird 2.1.
- Тип SQL_BIT поддерживается, начиная с Firebird 3.0/InterBase 7.0.
Назначение функций и примеры их использования.
Строковые функции
| Функция | Описание | Примеры |
|---|---|---|
| ASCII (string_exp) | Возвращает ASCII-код первого символа слева строкового выражения. | {fn ASCII(‘A’)} = 65 {fn ASCII(‘BCD’)} = 66 |
| BIT_LENGTH (string_exp) | Возвращает длину в битах для строкового выражения. | {fn BIT_LENGTH(‘hello’)} = 40 {fn BIT_LENGTH(‘hello’)} = 80 — для Unicode |
| CHAR (code) | Возвращает символ по его ASCII-коду. | {fn CHAR(65)} = ‘A’ |
| CHAR_LENGTH (string_exp) | Возвращает длину в символах строкового выражения. Эквивалентна функции CHARACTER_LENGTH. | {fn CHAR_LENGTH(‘hello’)} = 5 |
| CHARACTER_LENGTH(string_exp) | Возвращает длину в символах строкового выражения. Эквивалентна функции CHAR_LENGTH. | {fn CHARACTER_LENGTH (‘hello’)} = 5 |
| CONCAT (string_exp1, string_exp2) | Возвращает результат объединения двух строковых выражений. | {fn CONCAT(‘Hel’, ‘lo’)} = ‘Hello’ |
| INSERT (string_exp1, start, length, string_exp2) | Возвращает строковое выражение, где в строке string_exp1, начиная с символа start, length символов заменены строкой string_exp2. | {fn INSERT(‘1.23.2′,3,2,’8’)} = ‘1.8.2’ |
| LCASE (string_exp) | Возвращает строковое выражение, приведенное к нижнему регистру. | {fn LCASE(‘HELLO’)} = ‘ hello’ |
| LEFT (string_exp, count) | Возвращает левую часть строкового выражения. | {fn LEFT(‘ hello’, 4)} = ‘ hell’ |
| LENGTH (string_exp) | Возвращает длину строки в символах без оконечных пробелов. | {fn LENGTH(‘ hello ‘)} = 5 |
| LOCATE (string_exp1, string_exp2[, start]) | Возвращает позицию первого вхождения string_exp1 в string_exp2. Если аргумент start не указан, то поиск идет с первого символа. Если строка не найдена, то функция возвращает 0. | {fn LOCATE(‘ll’, ‘hello’)} = 3 {fn LOCATE(‘la’, ‘hello’)} = 0 {fn LOCATE(‘lo’, ‘hello’, 3)} = 4 {fn LOCATE(‘ll’, ‘hello’, 4)} = 0 |
| LTRIM (string_exp) | Удаляет пробелы с начала строки. | {fn LTRIM (‘ hello ‘)} = ‘hello ‘ |
| OCTET_LENGTH (string_exp) | Возвращает длину строки в байтах. | {fn OCTET_LENGTH(‘hello’)} = 5 |
| POSITION (string_exp1 IN string_exp2) | Возвращает позицию первого вхождения string_exp1 в string_exp2. Если строка не найдена, то функция возвращает 0. |
{fn POSITION(‘ll’ IN ‘hello’)} = 3 {fn POSITION(‘la’ IN ‘hello’)} = 0 |
| RIGHT (string_exp, count) | Возвращает count символов с конца строки. | {fn RIGHT(‘hello’, 2)} = ‘lo’ |
| RTRIM (string_exp) | Удаляет пробелы с конца строки. | {fn RTRIM (‘ hello ‘)} = ‘ hello’ |
| SPACE (count) | Возвращает строку, состоящую из count пробелов. | {fn SPACE(5)} = ‘ ‘ |
| SUBSTRING (string_exp, start, length) | Возвращает часть строки string_exp, начиная с позиции start длиной length. | {fn SUBSTRING(‘hello’, 2, 3)} = ‘ell’ |
| UCASE (string_exp) | Возвращает строку, приведенную к верхнему регистру. | {fn UCASE (‘Hello’)} = ‘HELLO’ |
Числовые функции
| Функция | Описание | Примеры |
|---|---|---|
| ABS (numeric_exp) | Возвращает абсолютную величину аргумента. | {fn ABS(-5)} = 5 {fn ABS(5)} = 5 |
| ACOS (float_exp) | Возвращает арккосинус угла, указанного в радианах. | {fn ACOS(1)} = 0 |
| ASIN (float_exp) | Возвращает арккосинус угла, указанного в радианах. | {fn ASIN(0)} = 1 |
| ATAN (float_exp) | Возвращает арктангенс угла, указанного в радианах. | {fn ATAN(0)} = 0 |
| ATAN2 (float_exp1, float_exp2) | Возвращает арктангенс угла, отсчитываемого от оси 0X до точки (float_exp1, float_exp2) | {fn ATAN2(0, 1)} = 0 |
| CEILING (numeric_exp) | Возвращает наименьшее целое, большее или равное аргументу. | {fn CEILING(5.6)} = 6 {fn CEILING(-5.6)} = -5 |
| COS (float_exp) | Возвращает косинус угла, указанного в радианах. | {fn COS(0)} = 1 |
| COT (float_exp) | Возвращает котангенс угла, указанного в радианах. | {fn COT(1)} = 0.642(…) |
| DEGREES (numeric_exp) | Преобразует радианы в градусы. | {fn DEGREES(1)} = 57.295(…) |
| EXP (float_exp) | Возвращает экспоненту числа. | {fn EXP(0)} = 1 |
| FLOOR (numeric_exp) | Возвращает наименьшее целое, меньшее или равное аргументу. | {fn FLOOR(5.6)} = 5 {fn FLOOR(-5.6)} = -6 |
| LOG (float_exp) | Возвращает натуральный логарифм числа. | {fn LOG(1)} = 0 |
| LOG10 (float_exp) | Возвращает десятичный логарифм числа. | {fn LOG10(1)} = 0 |
| MOD (integer_exp1, integer_exp2) | Возвращает результат деления по модулю integer_exp1 на integer_exp2. | {fn MOD (16, 6)} = 4 |
| PI ( ) | Возвращает число PI. | {fn PI()} = 3.1419… |
| POWER (numeric_exp, integer_exp) | Возвращает результат возведения числа numeric_exp в степень integer_exp. | {fn POWER(2,3)} = 8 |
| RADIANS (numeric_exp) | Преобразует градусы в радианы. | {fn RADIANS(360)} = 6.283… |
| RAND () | Возвращает случайное число. | {fn RAND()} = (случайное число в диапазоне [0..1]) |
| ROUND (numeric_exp, integer_exp) | Возвращает результат округления числа numeric_exp до integer_exp знаков после запятой. Если integer_exp отрицательное, то округление идет до |integer_exp| знаков перед запятой. | {fn ROUND (2.236, 2)} = 2.24 {fn ROUND (125.15, -1)} = 130 |
| SIGN (numeric_exp) | Возвращает знак числа. Если numeric_exp больше нуля, то возвращается 1. Если numeric_exp меньше нуля, то возвращается -1. Если numeric_exp равно нулю возвращается 0. |
{fn SIGN(15)} = 1 {fn SIGN(-1.25)} = -1 {fn SIGN(0)} = 0 |
| SIN (float_exp) | Возвращает синус угла, указанного в радианах. | {fn SIN(0)} = 0 |
| SQRT (float_exp) | Возвращает квадратный корень из числа. | {fn SQRT(9)} = 3 |
| TAN (float_exp) | Возвращает тангенс угла, указанного в радианах. | {fn TAN(0)} = 0 |
| TRUNCATE (numeric_exp, integer_exp) | Возвращает результат отсечения от числа numeric_exp разрядов вплоть до integer_exp знаков после запятой. Если integer_exp отрицательное, то отсечение идет до |integer_exp| знаков перед запятой. | {fn TRUNCATE (2.236, 2)} = 2.23 {fn TRUNCATE (125.15, -1)} = 120 |
Функции даты и времени
| Функция | Описание | Примеры |
|---|---|---|
| CURRENT_DATE () | Возвращает текущую дату. | {fn CURRENT_DATE()} |
| CURRENT_TIME | Возвращает текущее время. | {fn CURRENT_TIME} |
| CURRENT_TIMESTAMP | Возвращает текущую временную метку. | {fn CURRENT_TIMESTAMP} |
| CURDATE () | Возвращает текущую дату. | {fn CURDATE()} |
| CURTIME () | Возвращает текущее время. | {fn CURTIME()} |
| DAYNAME (date_exp) | Возвращает строку с названием дня недели. first_week_day — параметр устанавливается в строке подключения или в параметрах команды (в ADO). По умолчанию он равен 1 (Понедельник). Для версий InterBase >= 7.5, Firebird >= 1.5 и Yaffil возвращаются названия дней недели Monday, Tuesday, Wednesday, и т.д. Для более старых версий: WEEKDAY_1 — для понедельника WEEKDAY_2 — вторник WEEKDAY_3 — среда и т.д. |
Для версий InterBase >= 7.5, Firebird >= 1.5, Yaffil: {fn DAYNAME({d ‘2007-10-01’})} = ‘Monday’ Для более старых версий: first_week_day = 1 [default] {fn DAYNAME({d ‘2007-04-01’})} = ‘WEEKDAY_1’ first_week_day = 7 {fn DAYNAME({d ‘2007-04-01’})} = ‘WEEKDAY_2’ |
| DAYOFMONTH (date_exp) | Возвращает номер дня месяца как целое значение в диапазоне от 1 до 31. | {fn DAYOFMONTH({d ‘2007-01-25’})} = 25 |
| DAYOFWEEK (date_exp) | Возвращает номер дня недели, как целое значение в диапазоне от 1 до 7. Возвращаемое значение зависит от свойства инициализации first_week_day.Описание параметра first_week_day см. в DAYNAME |
Если first_week_day = 1 [default] {fn DAYOFWEEK({d ‘2007-01-07’})} = 7 Если first_week_day = 7 {fn DAYOFWEEK({d ‘2007-01-07’})} = 1 |
| DAYOFYEAR (date_exp) | Возвращает номер дня года как целое значение в диапазоне от 1 до 366. | {fn DAYOFYEAR({d ‘2007-01-02’})} = 2 {fn DAYOFYEAR({d ‘2007-12-31’})} = 365 |
| EXTRACT (extract-field FROM extract-source) | Возвращает часть даты, определенную аргументом extract-field. Возможны следующие значения extract-field: YEAR MONTH DAY HOUR MINUTE SECOND |
{fn EXTRACT(YEAR FROM {d ‘2000-01-01’})} = 2000 {fn EXTRACT(MONTH FROM {d ‘2000-05-01’})} = 5 {fn EXTRACT(DAY FROM {d ‘2007-08-28’})} = 28 {fn EXTRACT(HOUR FROM {ts ‘2008-08-05 02:02:03’})} = 2 {fn EXTRACT(MINUTE FROM {t ’02:10:03′})} = 10 {fn EXTRACT(SECOND FROM {t ’01:02:00.589′})} = 0.589 |
| HOUR (time_exp) | Извлекает часы из time_exp, как целое значение в диапазоне от 0 до 23. | {fn HOUR({ts ‘2008-05-08 02:02:03’})} = 2 |
| MINUTE (time_exp) | Извлекает минуты из time_exp как целое значение в диапазоне от 0 до 59. | {fn MINUTE({t ’11:59:03′})} = 59 |
| MONTH (date_exp) | Извлекает месяц из date_exp как целое число в диапазоне от 1 до 12. | {fn MONTH({d ‘2000-04-01’})} = 4 |
| MONTHNAME (date_exp) | Возвращает строку, содержащую название месяца. | Для версий InterBase >= 7.5, Firebird >= 1.5, Yaffil: {fn MONTHNAME({d ‘2007-04-01’})} = ‘April’ Для более старых версий: {fn MONTHNAME({d ‘2007-04-01’})} = ‘MONTH_4’ |
| NOW () | Возвращает текущую дату и время. | {fn NOW()} |
| QUARTER (date_exp) | Возвращает номер квартала как целое значение в диапазоне от 1 до 4, где 1 возвращается, если дата находится между 1 января и 31 марта включительно. | {fn QUARTER({d ‘2007-04-01’})} = 2 |
| SECOND (time_exp) | Извлекает секунды из time_exp, как целое значение в диапазоне от 0 до 59. | {fn SECOND({t ’11:00:59′})} = 59 |
| TIMESTAMPADD (interval, integer_exp, timestamp_exp) | Возвращает временную метку, полученную путем добавления к timestamp_exp значения integer_exp для интервала interval. interval может принимать следующие значения: SQL_TSI_FRAC_SECOND SQL_TSI_SECOND SQL_TSI_MINUTE SQL_TSI_HOUR SQL_TSI_DAY SQL_TSI_WEEK SQL_TSI_MONTH SQL_TSI_QUARTER SQL_TSI_YEAR где доли секунды представлены миллиардными секунды. |
{fn TIMESTAMPADD(SQL_TSI_QUARTER, 2, {d ‘1998-05-02’})} = ‘1998-11-02’ {fn TIMESTAMPADD(SQL_TSI_DAY, -10, {d ‘2004-03-04’})} = ‘2004-02-23’ {fn TIMESTAMPADD(SQL_TSI_MONTH, 23, {d ‘1998-05-01’})} = ‘2000-04-01’ {fn TIMESTAMPADD(SQL_TSI_WEEK, 2, {ts ‘2007-10-18 01:02:03’})} = ‘2007-11-01 01:02:03’ {fn TIMESTAMPADD(SQL_TSI_DAY, -10, {d ‘2004-03-04’})} = ‘2004-02-23’ {fn TIMESTAMPADD(SQL_TSI_HOUR, 23, {ts ‘1998-05-01 01:02:03’})} = ‘1998-05-02 00:02:03’ {fn TIMESTAMPADD(SQL_TSI_MINUTE, -63, {t ’01:02:03′})} = ’23:59:03′ {fn TIMESTAMPADD(SQL_TSI_SECOND, -63, {t ’01:02:03′})} = ’01:01:00′ {fn TIMESTAMPADD(SQL_TSI_FRAC_SECOND, 51000000, {t ’01:02:03′})} = 01:02:03.0510′ |
| TIMESTAMPDIFF (interval, timestamp_exp1, timestamp_exp2) | Возвращает разницу в interval, на которую timestamp_exp2 больше чем timestamp_exp1, выраженную целым числом. interval может принимать следующие значения: SQL_TSI_FRAC_SECOND SQL_TSI_SECOND SQL_TSI_MINUTE SQL_TSI_HOUR SQL_TSI_DAY SQL_TSI_MONTH SQL_TSI_YEAR SQL_TSI_FRAC_SECOND — доли секунды представлены 1 миллиардной секунды. |
{fn TIMESTAMPDIFF(SQL_TSI_YEAR, {ts ‘1998-12-29 01:02:03’}, {ts ‘2003-01-01 01:02:03’})} = 5 {fn TIMESTAMPDIFF(SQL_TSI_MONTH, {d ‘2007-01-30’}, {d ‘2007-01-31’})} = 0 {fn TIMESTAMPDIFF(SQL_TSI_DAY, {d ‘2000-03-04’}, {d ‘2000-02-22’})} = 11 {fn TIMESTAMPDIFF(SQL_TSI_HOUR, {ts ‘1998-05-01 01:02:03’}, {ts ‘1998-05-02 00:02:03’})} = 23 {fn TIMESTAMPDIFF(SQL_TSI_MINUTE, {t ’01:59:03′}, {t ’01:02:05′})} = -57 {fn TIMESTAMPDIFF(SQL_TSI_SECOND, {t ’01:02:03′}, {t ’01:01:00′})} = -63 {fn TIMESTAMPDIFF(SQL_TSI_FRAC_SECOND, {t ’01:02:03.051′}, {t ’01:02:03.010′})} = -41000000 |
| WEEK (date_exp) | Извлекает номер недели из date_exp, как целое число в диапазоне от 1 до 53. | {fn WEEK({d ‘2007-01-01’})} = 0 {fn WEEK({d ‘2006-01-01’})} = 52 |
| YEAR (date_exp) | Извлекает год из date_exp. | {fn YEAR({d ‘1982-06-19’})} = 1982 |
Системные функции
| Функция | Описание | Примеры |
|---|---|---|
| IFNULL (exp, value) | Если exp является null, тогда функция возвращает value. Если exp не является null, тогда функция возвращает exp. Тип данных value должен быть совместим с типом данных exp. |
{fn IFNULL(NULL, ‘Hello’)} = ‘Hello’ {fn IFNULL(‘Test’, ‘Hello’)} = ‘Test’ |
| USER () | Возвращает имя текущего пользователя. | {fn USER()} |
Функции преобразования типов данных
| Функция | Описание | Примеры |
|---|---|---|
| CONVERT (value_exp, data_type) | Возвращает значение value_exp, приведенное к типу data_type. data_type может принимать следующие значения: SQL_BIT, SQL_BIGINT, SQL_CHAR, SQL_DECIMAL, SQL_DOUBLE, SQL_FLOAT, SQL_INTEGER, SQL_LONGVARCHAR, SQL_NUMERIC, SQL_REAL, SQL_SMALLINT, SQL_DATE, SQL_TIME, SQL_TIMESTAMP, SQL_VARCHAR. Для некоторых типов опционально могут быть указаны дополнительные параметры: SQL_CHAR(size), SQL_DECIMAL(scale, precision), SQL_NUMERIC(scale, precision), SQL_VARCHAR(size). |
{fn CONVERT(195, SQL_CHAR)} = ‘195’ {fn CONVERT(195, SQL_DECIMAL(5,0))} = 195 {fn CONVERT(‘15.81’, SQL_FLOAT)} = 15.81 {fn CONVERT(‘01.02.2007’, SQL_DATE)} = 01.02.2007 {fn CONVERT(195, SQL_VARCHAR(10))} = ‘195’ |
Полезные ссылки
- Скачать Firebird
- ODBC Firebird driver, ODBC InterBase или OLE DB?
- Olivier Bridgeman
- IBProvider. Пример вызова хранимых процедур в ODBC стиле в статье MS SQL Linked Server. Как подключить Firebird/InterBase к SQL Server
- IBProvider. Пример вызова хранимой процедуры в ODBC стиле (IN, OUT параметры) (С++, VB)
- IBProvider. Пример вызова хранимой процедуры в ODBC стиле (Получение rowset) (С++, VB)
- Статья в MSDN
- Статья в MSDN
- Подключение к Firebird/InterBase в Visual Studio .Net (примеры на c#
- Новые возможности Firebird 2.1 в ADO.Net (c#).
- Новые возможности Firebird 2.0 в ADO.Net (c#).
