Функция EXTRACT
Функция EXTRACT извлекает отдельные части из даты или даты-времени.
Синтаксис
SELECT EXTRACT(что_извлечь FROM дата) FROM имя_таблицы WHERE условие
Вместо ‘что_извлечь’ можно написать, к примеру, DAY — тогда из даты будет извлечен день, или, к примеру, YEAR — тогда будет извлечен год. Если же я напишу так: YEAR_MONTH — то будет извлечен год и месяц (слитно, без разделителя). Если вам нужно извлекать несколько частей не слитно, а используя разделитель — используйте DATE_FORMAT .
Форматы вывода
- SECOND секунды
- MINUTE минуты
- HOUR часы
- DAY дни
- MONTH месяцы
- YEAR года
- MINUTE_SECOND минуты и секунды
- HOUR_MINUTE часы и минуты
- DAY_HOUR дни и часы
- YEAR_MONTH года и месяцы
- HOUR_SECOND
часы, минуты, секунды
- DAY_MINUTE
дни, часы, минуты
- DAY_SECOND
дни, часы, минуты, секунды
Таблицы для примеров
| id айди |
name имя |
date дата рождения |
|---|---|---|
| 1 | user1 | 1988-03-01 |
| 2 | user2 | 1989-04-02 |
| 3 | user3 | 1990-05-03 |
Пример
В данном примере при выборке из таблицы из даты извлекается день месяца:
SELECT *, EXTRACT(DAY FROM date) as day FROM users
Результат выполнения кода:
| id айди |
name имя |
date дата рождения |
day день |
|---|---|---|---|
| 1 | user1 | 1988-03-01 | 1 |
| 2 | user2 | 1989-04-02 | 2 |
| 3 | user3 | 1990-05-03 | 3 |
Пример
В данном примере при выборке из таблицы из даты извлекается год:
SELECT *, EXTRACT(YEAR FROM date) as year FROM users
Результат выполнения кода:
| id айди |
name имя |
date дата рождения |
year год |
|---|---|---|---|
| 1 | user1 | 1988-03-01 | 1988 |
| 2 | user2 | 1989-04-02 | 1989 |
| 3 | user3 | 1990-05-03 | 1990 |
Пример
В данном примере при выборке из таблицы из даты извлекается год и месяц (слитно):
SELECT *, EXTRACT(YEAR_MONTH FROM date) as yearmonth FROM users
Результат выполнения кода:
| id айди |
name имя |
date дата рождения |
yearmonth год и месяц |
|---|---|---|---|
| 1 | user1 | 1988-03-01 | 198803 |
| 2 | user2 | 1989-04-02 | 198904 |
| 3 | user3 | 1990-05-03 | 199005 |
Смотрите также
- функцию DATE ,
которая извлекает дату из даты-времени - функцию YEAR ,
которая извлекает год из даты - функцию MONTH ,
которая извлекает месяц из даты - функцию DAY ,
которая извлекает день из даты
MONTH (Transact-SQL)
Возвращает целое число, представляющее месяц указанной даты date.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
MONTH ( date )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
date
Выражение, которое можно привести к значению типа time, date, smalldatetime, datetime, datetime2 или datetimeoffset. Аргумент date может быть выражением, выражением столбца, определяемой пользователем переменной или строковым литералом.
Тип возвращаемых данных
int
Возвращаемое значение
Функция MONTH возвращает то же значение, что и функция DATEPART (month, date).
Если дата date содержит только компонент времени, возвращаемое значение равно 1, базовому месяцу.
Примеры
Следующая инструкция возвращает значение 4 . Порядковый номер месяца.
SELECT MONTH('2007-04-30T01:01:01.1234567 -07:00');
Следующая инструкция возвращает значение 1900, 1, 1 . В качестве значения аргумента date задается число 0 . SQL Server интерпретируется 0 как 1 января 1900 г.
SELECT YEAR(0), MONTH(0), DAY(0);
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
В приведенном ниже примере возвращается 4 . Порядковый номер месяца.
-- Uses AdventureWorks SELECT TOP 1 MONTH('2007-04-30T01:01:01.1234') FROM dbo.DimCustomer;
В приведенном ниже примере возвращается 1900, 1, 1 . В качестве значения аргумента date задается число 0 . SQL Server интерпретируется 0 как 1 января 1900 г.
-- Uses AdventureWorks SELECT TOP 1 YEAR(0), MONTH(0), DAY(0) FROM dbo.DimCustomer;
Как выбрать месяц из даты sql
Техника извлечения месяца из даты не сильно отличается от получения года. Я отвечал на подобный вопрос вот тут. Также используется функция EXTRACT . Только вместо YEAR мы пишем MONTH :
SELECT EXTRACT(MONTH FROM TIMESTAMP '2022-08-26 12:24:56');
EXTRACT — извлечение из даты части (год, месяц, день. )
Функция extract получает из значений даты/времени поля, такие как год или час. Здесь source — значение типа timestamp , time или interval . (Выражения типа date приводятся к типу timestamp , так что допускается и этот тип.) Указанное поле представляет собой идентификатор, по которому из источника выбирается заданное поле. Функция extract возвращает значения типа numeric . Допустимые поля:
century
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13')
| # | date_part |
|---|---|
| 1 | 20 |
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 21 |
Первый век начался 0001-01-01 00:00:00, хотя люди в то время и не считали так. Это определение распространяется на все страны с григорианским календарём. Века с номером 0 не было; считается, что 1 наступил после -1. Если такое положение вещей вас не устраивает, направляйте жалобы по адресу: Ватикан, Собор Святого Петра, Папе.
day
Для значений timestamp это день месяца (1–31); для значений interval — число дней
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 16 |
SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
| # | date_part |
|---|---|
| 1 | 40 |
decade
Год, делённый на 10
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 200 |
dow
День недели, считая с воскресенья (0) до субботы (6)
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 5 |
Заметьте, что в extract дни недели нумеруются не так, как в функции to_char(. ‘D’).
doy
День года (1–365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40')
| # | date_part |
|---|---|
| 1 | 47 |
epoch
Для значений timestamp with time zone это число секунд с 1970-01-01 00:00:00 UTC (отрицательное для предшествующего времени); для значений date и timestamp — номинальное число секунд с 1970-01-01 00:00:00 без учёта часового пояса, переходов на летнее время и т. п.; для значений interval — общее количество секунд в интервале
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
| # | date_part |
|---|---|
| 1 | 982384720.12 |
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12');
| # | date_part |
|---|---|
| 1 | 982355920.12 |
SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
| # | date_part |
|---|---|
| 1 | 442800 |
Преобразовать время эпохи назад, в значение timestamp with time zone, с помощью to_timestamp можно так:
SELECT to_timestamp(982384720.12);
| # | to_timestamp |
|---|---|
| 1 | 2001-02-17 10:38:40.12+06 |
Имейте в виду, что применяя to_timestamp к времени эпохи, извлечённому из значения date или timestamp, можно получить не вполне ожидаемый результат: эта функция подразумевает, что изначальное значение задано в часовом поясе UTC, но это может быть не так.
hour
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 20 |
isodow
День недели, считая с понедельника (1) до воскресенья (7)
SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
| # | date_part |
|---|---|
| 1 | 7 |
Результат отличается от dow только для воскресенья. Такая нумерация соответствует ISO 8601.
isoyear
Год по недельному календарю ISO 8601, в который попадает дата (неприменимо к интервалам)
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
| # | date_part |
|---|---|
| 1 | 2005 |
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
| # | date_part |
|---|---|
| 1 | 2006 |
Год по недельному календарю ISO начинается с понедельника недели, в которой оказывается 4 января, так что в начале января или в конце декабря год по ISO может отличаться от года по григорианскому календарю. Подробнее об этом рассказывается в описании поля week.
Этого поля не было в PostgreSQL до версии 8.3.
julian
Юлианская дата, соответствующая дате или дате/времени (для интервала не определена). Значение будет дробным, если заданное время отличается от начала суток по местному времени. За дополнительной информацией обратитесь к Разделу B.7.
SELECT EXTRACT(JULIAN FROM DATE '2006-01-01');
| # | date_part |
|---|---|
| 1 | 2453737 |
SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00');
| # | date_part |
|---|---|
| 1 | 2453737.5 |
microseconds
Значение секунд с дробной частью, умноженное на 1 000 000; заметьте, что оно включает и целые секунды
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
| # | date_part |
|---|---|
| 1 | 28500000 |
millennium
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 3 |
Годы 20 века относятся ко второму тысячелетию. Третье тысячелетие началось 1 января 2001 г.
milliseconds
Значение секунд с дробной частью, умноженное на 1 000; заметьте, что оно включает и целые секунды.
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
| # | date_part |
|---|---|
| 1 | 28500 |
minute
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 38 |
month
Для значений timestamp это номер месяца в году (1–12), а для interval — остаток от деления числа месяцев на 12 (0–11)
SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 2 |
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
| # | date_part |
|---|---|
| 1 | 3 |
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
| # | date_part |
|---|---|
| 1 | 1 |
quarter
Квартал (1–4), к которому относится дата
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 1 |
second
Секунды, включая дробную часть
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 40 |
SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
| # | date_part |
|---|---|
| 1 | 28.5 |
timezone
Смещение часового пояса от UTC, представленное в секундах. Положительные значения соответствуют часовым поясам к востоку от UTC, а отрицательные — к западу. (Строго говоря, в Postgres Pro используется не UTC, так как секунды координации не учитываются.)
timezone_hour
Поле часов в смещении часового пояса
timezone_minute
Поле минут в смещении часового пояса
week
Номер недели в году по недельному календарю ISO 8601. По определению, недели ISO 8601 начинаются с понедельника, а первая неделя года включает 4 января этого года. Другими словами, первый четверг года всегда оказывается в 1 неделе этого года.
В системе нумерации недель ISO первые числа января могут относиться к 52-ой или 53-ей неделе предыдущего года, а последние числа декабря — к первой неделе следующего года. Например, 2005-01-01 относится к 53-ей неделе 2004 г., а 2006-01-01 — к 52-ей неделе 2005 г., тогда как 2012-12-31 включается в первую неделю 2013 г. Поэтому для получения согласованных результатов рекомендуется использовать поле isoyear в паре с week.
SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 7 |
year
Поле года. Учтите, что года 0 не было, и это следует иметь в виду, вычитая из годов нашей эры годы до нашей эры.
SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 2001 |
Примечание
С аргументом +/-бесконечность extract возвращает +/-бесконечность для монотонно увеличивающихся полей (epoch, julian, year, isoyear, decade, century и millennium). Для других полей возвращается NULL. До версии 9.6 Postgres Pro возвращал ноль для всех случаев с бесконечными аргументами.
Функция extract в основном предназначена для вычислительных целей. Функции форматирования даты/времени описаны в Разделе 9.8.
Функция date_part эмулирует традиционный для Ingres эквивалент стандартной SQL-функции extract:
date_part(‘поле’, источник)
Заметьте, что здесь параметр поле должен быть строковым значением, а не именем. Функция date_part воспринимает те же поля, что и extract. По историческим причинам функция date_part возвращает значения типа double precision. В некоторых случаях это может привести к потере точности. Поэтому вместо неё рекомендуется использовать функцию extract.
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
| # | date_part |
|---|---|
| 1 | 16 |
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');