====== EXTRACT ====== ===== Версии сервера ===== ^ 0.9 ^ 1.0 ^ 1.5.3 ^ 1.5.4 ^ 1.5.5 ^ 2.0 ^ 2.0.3 ^ 2.0.4 ^ 2.1 ^ 2.5 ^ 3.0 ^ | Да | Да | Да | Да | Да | Да | Да | Да | Да | Да | ? | ===== Формат ===== EXTRACT (part FROM value) где value должно быть следующего типа : [[tipy_dannyx|DATE]], [[tipy_dannyx|TIME]], [[tipy_dannyx|TIMESTAMP]]. ===== Описание ===== Встроенная функция. Позволяет извлекать дату и время. Извлекаемая часть должна присутствовать в значении. Например, не стоит извлекать год из данных, где хранится время. EXTRACT (YEAR FROM aTime) выдаст ошибку. Значения, которые можно извлекать, представлены в следующей таблице ^ Служебное слово ^ Тип данных ^ Значение ^ |YEAR | [[tipy_dannyx|SMALLINT]] | Год, 1-9999 | |MONTH | [[tipy_dannyx|SMALLINT]] | Месяц, 1-12 | |DAY | [[tipy_dannyx|SMALLINT]] | День, 1-31 | |HOUR | [[tipy_dannyx|SMALLINT]] | Час, 0-23 | |MINUTE | [[tipy_dannyx|SMALLINT]] | Минут, 0-59 | |SECOND | [[tipy_dannyx|NUMERIC(9,4)]] |Секунд, 0.0000-59.9999 | |MILLISECOND | [[tipy_dannyx|NUMERIC(9,1)]] |Миллисекунд, 0.0–999.9 (начиная с версии 2.1.2) | |WEEK | [[tipy_dannyx|SMALLINT]] |Номер недели года, 1–53 (начиная с версии 2.1) | |WEEKDAY | [[tipy_dannyx|SMALLINT]] |День недели, 0-6 (начиная с Воскресенья) | |YEARDAY | [[tipy_dannyx|SMALLINT]] | День года, 0-365 | ===== Пример ===== процедура, возвращающая дату и время в текстовом виде в формате '00.00.0000 00:00' CREATE OR ALTER PROCEDURE BDATE_TIME( DT TIMESTAMP) RETURNS ( RESULT VARCHAR(16)) AS begin --извлекаем день select l.result||'.' from lpad(extract(day from :dt),2,'0') l into result; --извлекаем месяц select :result||l.result||'.' from lpad(extract(month from :dt),2,'0') l into result; --извлекаем год select :result||l.result||' ' from lpad(extract(year from :dt),4,'0') l into result; --извлекаем час select :result||l.result||':' from lpad(extract(hour from :dt),2,'0') l into result; --извлекаем минута select :result||l.result from lpad(extract(minute from :dt),2,'0') l into result; --result = '00.00.0000 00:00'; suspend; end два варианта получания номера квартала из даты SELECT CAST(EXTRACT(MONTH FROM CURRENT_TIMESTAMP)/3 + 0.3 AS INTEGER) FROM RDB$DATABASE SELECT (EXTRACT(MONTH FROM CURRENT_TIMESTAMP)-1)/3+1 FROM RDB$DATABASE Получение номера недели в году, источник [[http://www.volny.cz/iprenosil/interbase/ip_ib_code_timestamp.htm|Date functions]] CREATE PROCEDURE YearWeek (D DATE) RETURNS (WEEK_NO INTEGER) AS BEGIN D = D - EXTRACT(WEEKDAY FROM D-1) + 3; /* move to thursday */ WEEK_NO = (EXTRACT(YEARDAY FROM D) - EXTRACT(WEEKDAY FROM D-1) + 7) / 7e0; SUSPEND; END ===== См. также ===== [[matematicheskie_operacii_s_datoj|Математические операции с датой и временем]], [[ADDMILLISECOND()]], [[ADDSECOND()]], [[ADDMINUTE()]], [[ADDDAY()]], [[ADDWEEK]], [[ADDMONTH()]], [[ADDYEAR()]] ===== Источник ===== ib60releasenotes.pdf