EXTRACT

Версии сервера

0.91.01.5.31.5.41.5.52.02.0.32.0.42.12.53.0
ДаДаДаДаДаДаДаДаДаДа?

Формат

EXTRACT (part FROM value)

где

value должно быть следующего типа : DATE, TIME, TIMESTAMP.

Описание

Встроенная функция. Позволяет извлекать дату и время. Извлекаемая часть должна присутствовать в значении. Например, не стоит извлекать год из данных, где хранится время. EXTRACT (YEAR FROM aTime) выдаст ошибку.

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

Служебное словоТип данныхЗначение
YEARSMALLINTГод, 1-9999
MONTHSMALLINTМесяц, 1-12
DAYSMALLINTДень, 1-31
HOURSMALLINTЧас, 0-23
MINUTESMALLINTМинут, 0-59
SECONDNUMERIC(9,4)Секунд, 0.0000-59.9999
MILLISECONDNUMERIC(9,1)Миллисекунд, 0.0–999.9 (начиная с версии 2.1.2)
WEEKSMALLINTНомер недели года, 1–53 (начиная с версии 2.1)
WEEKDAYSMALLINTДень недели, 0-6 (начиная с Воскресенья)
YEARDAYSMALLINTДень года, 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

См. также

Математические операции с датой и временем, ADDMILLISECOND(), ADDSECOND(), ADDMINUTE(), ADDDAY(), ADDWEEK, ADDMONTH(), ADDYEAR()

Источник

ib60releasenotes.pdf

Обсуждение