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

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


Боковая панель

Введение

Статьи и часто задаваемые вопросы

Установка и настройка

Обработка ошибок

Полезные запросы SQL

Тематические группы

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
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 (внешнее изменение)