Функция 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 ,
которая извлекает день из даты
Функция DATEPART стр. 2
В MySQL для извлечения каждой составляющей даты имеется соответствующая функция. Так, например, можно получить минуты времени отправления рейсов, которые вылетают в 1-ом часу дня (база данных «Аэропорт»):
Компоненту времени можно также получить при помощи функции EXTRACT . С помощи этой функции решение задачи можно записать в виде:
Дополнительно с помощью функции EXTRACT можно получить составные компоненты даты/времени, например, год и месяц. Решим такую задачу.
Посчитать количество окрасок по месяцам с учетом года (база данных «Окраска»).
Полный список допустимых компонент можно найти, например, здесь .
Примечание:
Здесь уместно будет отметить довольно вольную трактовку группировки в MySQL, при которой в списке столбцов предложения SELECT могут присутствовать столбцы с детализированными данными, отсутствующими в предложении GROUP BY. Очевидно, что агрегаты здесь подразумеваются, т.к., в противном случае, отсутствует однозначная интерпретация операции. Предполагаю, что здесь неявно используются функция MIN или MAX, но я даже не буду это специально выяснять, т.к. предпочитаю в подобных случаях следовать стандарту.
Функций типа Year, Month и т.д. в PostgreSQL, насколько мне известно, нет. Однако есть функция EXTRACT, и второе решение первой задачи, которое мы написали для MySQL, будет работать и под этой СУБД:
Имеется также функция, аналогичная DATEPART в MSSQL. Различия в синтаксисе, надеюсь, станут очевидны из примера решения той же задачи с использованием этой функции:
Перейдем к решению второй задачи. Составные компоненты не поддерживаются в функции EXTRACT для PostgreSQL. Поэтому можно использовать «классическую» групировку по двум компонентам — году и месяцу:
Тем не менее, мы можем реализовать идею составной компоненты при помощи функции форматирования даты TO_CHAR :
Результат будет аналогичен результату решения 3 за отсутствием первых двух столбцов, которые, разумеется, можно добавить в вывод, включив их одновременно в предложение GROUP BY, как это сделано в решении 4.
| Страницы: | 1 | 2 |
Как из даты получить год, месяц или день в T-SQL? Microsoft SQL Server
Привет, сегодня я покажу, как в T-SQL из даты можно получить определенную часть этой даты, например, год, месяц, день и даже час, иными словами, в данном материале мы ответим на несколько вопросов, которые связаны с извлечением данных из значения, содержащего дату.
Как в T-SQL получить текущую дату?
Для начала давайте я расскажу о том, как в Microsoft SQL Server можно получить значение текущей даты.
Для получения текущей даты в Microsoft SQL Server существует несколько специальных системных функций. Давайте некоторые из этих функций рассмотрим.
- GETDATE – функция возвращает значение, которое содержит дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, при этом смещение часового пояса не включается. Лично мне достаточно часто приходится пользоваться именно этой функцией;
- CURRENT_TIMESTAMP – эта функция эквивалентна функции GETDATE, она возвращает точно такое же значение. Вы можете использовать любую функцию, но как я уже сказал, лично я отдаю предпочтение функции GETDATE;
- SYSDATETIME – данная функция также возвращает дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, смещение часового пояса тоже не включается. Но в данном случае функция возвращает значение с более высокой точностью в долях секунды.
Примечание! Для того чтобы получить значение даты и времени с учетом смещения часового пояса, необходимо использовать функцию SYSDATETIMEOFFSET, а для того чтобы получить значение даты и времени в формате UTC функции GETUTCDATE или SYSUTCDATETIME.
Заметка! Начинающим рекомендую посмотреть мой видеокурс по T-SQL.
Пример – получение текущей даты в Microsoft SQL Server
В данном примере мы вызовем три функции получения текущей даты.
SELECT GETDATE() AS [GETDATE], CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP], SYSDATETIME() AS [SYSDATETIME]
Как видите, результат практически одинаковый, за исключением того, что SYSDATETIME вернула более точное значение времени.
Как получить год из даты в T-SQL?
Если у Вас возникла необходимость из даты получить год, то есть, например, из 01.01.2019 получить 2019 в виде отдельного значения или просто из текущей даты получить год, то в Microsoft SQL Server Вы это можете сделать несколькими способами.
Первый способ заключается в использовании специальной функции YEAR, которая как раз и делает ровно то, что нам нужно, иными словами, она возвращает целое число, представляющее год даты, указанной во входном параметре.
Второй способ предполагает использование другой функции T-SQL – это DATEPART, которая возвращает целое число, представляющее указанную часть даты.
DATEPART принимает два параметра: первый, datepart, т.е. какую часть даты нам нужно вернуть, второй, дата, которую необходимо обработать.
Пример – получаем год из даты в Microsoft SQL Server
В данном примере я покажу различные вариации передачи параметра DATE в указанные выше функции, так как его можно передать и в виде переменной, и в виде выражения, и в виде функции. Сразу скажу, что эти способы передачи параметра можно использовать и в других функциях, которые сегодня мы будем рассматривать.
Чтобы DATEPART нам вернула год из даты, первым параметром нам необходимо передать значение, характеризующее часть «год», допустимо передавать следующие значения: year, yyyy или yy.
--Объявляем переменную для хранения даты DECLARE @TestDate DATETIME --Присваиваем значение переменной (текущая дата) SET @TestDate = GETDATE() --Запрос SELECT SELECT @TestDate AS [Дата], --Передаем переменную в качестве параметра YEAR(@TestDate) AS [Год YEAR], DATEPART(YY, @TestDate) AS [Год DATEPART], --Передаем выражение, приводящее к типу DATE YEAR('01.01.2019') AS [Год YEAR], --В качестве параметра указываем функцию DATEPART(YY, GETDATE()) AS [Год DATEPART]

Как получить месяц из даты в T-SQL?
В T-SQL из даты можно получить и номер месяца, для этого можно использовать функцию MONTH, она возвращает целое число, представляющее месяц указанной даты или все ту же функцию DATEPART, в которую, в данном случае необходимо будет передать значение, характеризующее часть даты «месяц», можно использовать: month, mm или m.
Пример – получаем месяц из даты в Microsoft SQL Server
В этом примере мы получаем месяц из даты снова несколькими способами.
--Объявляем переменную для хранения даты DECLARE @TestDate DATETIME --Присваиваем значение переменной (текущая дата) SET @TestDate = GETDATE() --Запрос SELECT SELECT @TestDate AS [Дата], --Передаем переменную в качестве параметра MONTH(@TestDate) AS [Месяц MONTH], DATEPART(MM, @TestDate) AS [Месяц DATEPART], --Передаем выражение, приводящее к типу DATE MONTH('01.01.2019') AS [Месяц MONTH], --В качестве параметра указываем функцию DATEPART(MM, GETDATE()) AS [Месяц DATEPART]

Как из даты получить день в T-SQL?
Для того чтобы получить из даты день, в T-SQL можно использовать функцию DAY – это функция возвращает целое число, представляющее день указанной даты. Также можно использовать и уже знакомую функцию DATEPART со значением первого параметра: day, dd или d.
Пример – получаем день из даты в Microsoft SQL Server
Здесь также мы используем несколько способов для получения дня из даты.
--Объявляем переменную для хранения даты DECLARE @TestDate DATETIME --Присваиваем значение переменной (текущая дата) SET @TestDate = GETDATE() --Запрос SELECT SELECT @TestDate AS [Дата], --Передаем переменную в качестве параметра DAY(@TestDate) AS [День DAY], DATEPART(DD, @TestDate) AS [День DATEPART], --Передаем выражение, приводящее к типу DATE DAY('01.01.2019') AS [День DAY], --В качестве параметра указываем функцию DATEPART(DD, GETDATE()) AS [День DATEPART]

Как из даты получить час в T-SQL?
Чтобы из даты получить час, мы можем использовать функцию DATEPART со значением hour или hh. Только в данном случае второй параметр (date), в котором мы передаем значение даты, должен обязательно содержать время, т.е. иметь тип данных DATETIME, тип DATE не допускается.
Пример – получаем час из даты в Microsoft SQL Server
В этом примере мы из даты получаем час.
--Объявляем переменную для хранения даты DECLARE @TestDate DATETIME --Присваиваем значение переменной (текущая дата) SET @TestDate = GETDATE() --Запрос SELECT SELECT @TestDate AS [Дата], --Передаем переменную в качестве параметра DATEPART(HH, @TestDate) AS [Час], --В качестве параметра указываем функцию DATEPART(HH, GETDATE()) AS [Час]

У меня все, надеюсь, перечисленные выше примеры помогут Вам в решении Ваших задач. Начинающим программистам рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать на T-SQL в Microsoft SQL Server.
Как выделить месяц из даты sql
Из всех типов данных в SQL временны́е данные являются наиболее сложными . Сложность возникает по нескольким причинам, и вот некоторые из них:
- множество способов задания даты и времени
- наличие временных зон
- неочевидность вычислений некоторых значений на основании временных данных. Например, сложность вычисления возраста.
Временные данные можно получить одним из следующих способов:
- скопировать данные из существующего столбца с времéнным типом данных
- задать дату и время через строковое представление
- получить временны́е данные путём вызова встроенных функций, возвращающих временной тип данных
Для задания даты и времени используются следующие форматы:
| Тип | Формат по умолчанию |
|---|---|
| DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DD hh:mm:ss |
| TIMESTAMP | YYYY-MM-DD hh:mm:ss |
| TIME | hhh:mm:sss |
| YEAR | YYYY — полный формат YY или Y — сокращённый формат, который возвращает год в пределах 2000-2069 для значений 0-69 и год в пределах 1970-1999 для значений 70-99 |
Причём, при указании даты допускается использовать любой знак пунктуации в качестве разделительного между частями разделов даты или времени. Также возможно задавать дату вообще без разделительного знака, слитно.
Примеры валидного задания временных значений через строковое представление:
MySQLSELECT CAST("2022-06-16 16:37:23" AS DATETIME) AS datetime_1, CAST("2014/02/22 16*37*22" AS DATETIME) AS datetime_2, CAST("20220616163723" AS DATETIME) AS datetime_3, CAST("2021-02-12" AS DATE) AS date_1, CAST("160:23:13" AS TIME) AS time_1, CAST("89" AS YEAR) AS year
datetime_1 datetime_2 datetime_3 date_1 time_1 year 2022-06-16T16:37:23.000Z 2014-02-22T16:37:22.000Z 2022-06-16T16:37:23.000Z 2021-02-12T00:00:00.000Z 160:23:13 1989 В запросе выше для принудительного преобразования строки в дату и время была использована функция CAST . Она необходима, если сервер не ожидает временного значения и, соответственно, автоматически не преобразует строку к нужному типу. С преобразованием типов мы более подробно познакомимся в статье «Функции преобразования типов, CAST».
Если необходимо получить временные данные из строки, которая не соответствует ни одному формату, который принимает функция CAST , то можно использовать встроенную функцию STR_TO_DATE , которая принимает произвольную строку, содержащую дату, и формат, описывающий её.
MySQLSELECT STR_TO_DATE('November 13, 1998', '%M %d, %Y') AS date;
date 1998-11-13T00:00:00.000Z Более подробное описание функции STR_TO_DATE и её аргументов можно посмотреть в справочнике.
Для генерации же текущей даты или времени нет необходимости создавать строку для последующего её преобразования в дату, потому что есть встроенные функции для получения данных значений: CURDATE , CURTIME и NOW .
MySQLSELECT CURDATE(), CURTIME(), NOW();Иногда необходимо получить не всю дату, а только её конкретную часть, например, месяц или год.
Для этого в SQL есть следующие функции:
Функция Описание YEAR Возвращает год для указанной даты MONTH Возвращает числовое значение месяца года (от 1 до 12) даты DAY Возвращает порядковый номер дня в месяце (от 1 до 31) HOUR Возвращает значение часа (от 0 до 23) для времени MINUTE Возвращает значение минут (от 0 до 59) для времени В MySQL есть очень похожие друг на друга типы данных: DATETIME и TIMESTAMP . Они оба направлены на хранение даты и времени, но имеют ряд отличий, определяющих их целевое использование.
Критерий DATETIME TIMESTAMP Диапазон от 1000-01-01 00:00:00
до 9999-12-31 23:59:59от 1970-01-01 00:00:00
до 2038-01-19 03:14:07Часовой пояс Не учитывается
Отображается в таком виде, в котором дата была установленаУчитывается
При выборках отображается с учётом текущего часового пояса сервера БДТак как люди во всем мире хотят, чтобы полдень примерно соответствовал максимальному подъёму Солнца, то никогда не было задачи использовать универсальное время и мир был разделён на 24 часовых пояса.
В качестве точки отсчёта времени используется UTC (Coordinated Universal Time). Все остальные часовые пояса можно описать количеством часов сдвига от UTC. Для примера, часовой пояс Москвы может быть описан как UTC+3.
Часовой пояс является одной из настроек сервера баз данных и может задаваться:
- глобально
- для текущего пользователя
- для текущей пользовательской сессии
MySQLSET GLOBAL time_zone = '+03:00'; // глобально SET time_zone = '+03:00'; // для текущего пользователя SET @@session.time_zone = '+03:00'; // для текущей пользовательской сессииСоответственно, при изменении временной зоны все значения с типом TIMESTAMP будут выводиться с учётом текущей активной временной зоны.
Хочется отдельно остановиться на наиболее популярных задачах, связанных с временным типом данных, на которых часто совершаются ошибки.
При постановке задачи найти возраст человека по дате его рождения часто возникает соблазн вычислить разницу текущего года и года рождения человека:
MySQLSELECT YEAR(NOW()) - YEAR('2003-07-03 14:10:26');Проблема такого подхода в том, что он не учитывает был ли день рождения у данного человека в этом году или ещё нет. То есть, если на момент запроса уже наступило 3-е июля (07-03), то человек отпраздновал свой день рождения и ему уже 20 лет, иначе ему по-прежнему 19 года. Разница функций YEAR тут будет бесполезна — в обоих случаях она даст 20 лет.
Если определить возраст через разницу годов — неработающий вариант, то может возникнуть желание найти возраст через разницу дней между двумя датами, затем поделить эту разницу на количество дней в году и округлить вниз:
MySQLSELECT FLOOR(DATEDIFF(NOW(), '2003-07-03 14:10:26') / 365);И это решение будет гораздо точнее предыдущего. Но оно не будет абсолютно точным из-за наличия високосных годов, когда в году 366 дней. Хотя погрешность в вычислении возраста для 1 человека из-за наличия високосного года достаточно низкая, в вычислениях на определение, скажем, среднего возраста среди определённого списка людей, погрешность может накапливаться и исказить реальные значения.
И как же тогда корректно определять возраст? Для этого есть готовая встроенная функция — TIMESTAMPDIFF , которая первым аргументом принимает единицу измерения, в которой нужно вернуть разницу между двумя временными значениями.
Предыдущая запись
