Как вытащить месяц из даты в sql
Перейти к содержимому

Как вытащить месяц из даты в sql

  • автор:

Функция 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

    дни, часы, минуты, секунды

Таблицы для примеров

таблица users

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'); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *