Инструменты пользователя

Инструменты сайта


extract

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 должно быть следующего типа : DATE, TIME, TIMESTAMP.

Описание

Встроенная функция. Позволяет извлекать дату и время. Извлекаемая часть должна присутствовать в значении. Например, не стоит извлекать год из данных, где хранится время.

EXTRACT (YEAR FROM aTime)

выдаст ошибку.

Значения, которые можно извлекать, представлены в следующей таблице

Служебное слово Тип данных Значение
YEAR SMALLINT Год, 1-9999
MONTH SMALLINT Месяц, 1-12
DAY SMALLINT День, 1-31
HOUR SMALLINT Час, 0-23
MINUTE SMALLINT Минут, 0-59
SECOND NUMERIC(9,4) Секунд, 0.0000-59.9999
MILLISECOND NUMERIC(9,1) Миллисекунд, 0.0–999.9 (начиная с версии 2.1.2)
WEEK SMALLINT Номер недели года, 1–53 (начиная с версии 2.1)
WEEKDAY SMALLINT День недели, 0-6 (начиная с Воскресенья)
YEARDAY 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

Получение номера недели в году, источник 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

См. также

Источник

ib60releasenotes.pdf

Обсуждение

sunsay, 2009/06/03 13:35

Было бы не плохо указать код процедуры lpad :/

Attid, 2009/06/03 20:20, 2009/06/03 20:21
CREATE PROCEDURE LPAD(STR VARCHAR(60),
COUNT_ INTEGER,
SUBSTR VARCHAR(10))
 RETURNS(RESULT VARCHAR(60))
 AS
begin
/* Дополнение строки слева (LPAD)
 
Функция Дополнение строки слева заданными символами.
Спецификация
LPAD (<строка>, <длина> [, <подстрока> ])
<строка> ::= <значимое символьное выражение>
<длина> ::= <значимое числовое выражение>
<подстрока> ::= <значимое символьное выражение>
Общие правила
   1. <Строка> дополняется слева указанной в <подстроке> последовательностью символов до указанной <длины> (возможно, с повторением последовательности).
   2. Если <подстрока> не указана, то по умолчанию <строка> дополняется пробелами.
   3. Если <длина> меньше длины <строки>, то исходная <строка> усекается до заданной <длины>.
   4. Если длина <подстроки> больше чем указанная <длина>, то <строка> дополняется частью <подстроки>.
Возвращаемое значение
<Строка>, дополненная слева указанными последовательностями символов. Длина <строки>- максимум из исходной длины <строки> и <длины>.*/
  result = substring(:str FROM 1 FOR :count_);
  while (char_length(:result) < :count_) do
      result = :substr || :result;
  suspend;
end
AnyUser, 2011/07/26 17:12

В списке служебных слов не достаёт millisecond: select extract(millisecond from current_timestamp) from rdb$database T

Viktor Kuzmenko, 2013/03/20 16:01

поправьте: Час, 1-23 на Час, 0-23 с минутами то же самое

Ваш комментарий. Вики-синтаксис разрешён:
 
extract.txt · Последнее изменение: 2013/09/28 00:00 (внешнее изменение)