Как убрать время из даты sql
Чтобы убрать время из даты в SQL, можно использовать функцию DATE или CONVERT с указанием нужного формата.
Функция DATE :
SELECT DATE(column_name) FROM table_name;
Эта функция извлекает дату из столбца column_name и возвращает ее без времени. Результат будет иметь формат YYYY-MM-DD.
Функция CONVERT :
SELECT CONVERT(date, column_name) FROM table_name;
Функция CONVERT преобразует значение столбца column_name в тип date . Результат также будет иметь формат YYYY-MM-DD и не будет содержать времени.
Обратите внимание, что в зависимости от используемой СУБД и настроек сервера может потребоваться использовать иной формат для даты. Например, в MySQL можно использовать функцию DATE_FORMAT для преобразования даты в нужный формат. В любом случае, при использовании функций для изменения формата даты, следует учитывать особенности используемой СУБД и настроек сервера.
Как извлечь из datetime дату sql
Чтобы извлечь дату из значения datetime в SQL, можно использовать функцию DATE() . Синтаксис функции выглядит следующим образом:
DATE(datetime)
где datetime — это значение, из которого нужно извлечь дату.
Например, если у вас есть значение datetime 2023-04-08 14:30:00, то для извлечения даты используйте следующий запрос:
SELECT DATE('2023-04-08 14:30:00');
В результате выполнения этого запроса вы увидите дату 2023-04-08.
Также вы можете использовать функцию DATE_FORMAT() для форматирования даты в нужный формат. Например, чтобы отформатировать дату 2023-04-08 14:30:00 в формат ГГГГ-ММ-ДД, используйте следующий запрос:
SELECT DATE_FORMAT('2023-04-08 14:30:00', '%Y-%m-%d');
В результате выполнения этого запроса вы увидите дату 2023-04-08.
DATEPART (Transact-SQL)
Эта функция возвращает целое число, представляющее указанную часть datepart заданного типа date.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
DATEPART ( datepart , date )
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
datepart
Определенная часть аргумента date, для которого функция DATEPART вернет значение типа integer. В приведенной ниже таблице перечислены все допустимые аргументы datepart.
DATEPART не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.
datepart | Сокращения |
---|---|
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
weekday | dw |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
tzoffset | tz |
iso_week | isowk, isoww |
date
Выражение, которое разрешается в один из следующих типов данных:
Для date DATEPART будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.
Тип возвращаемых данных
INT
Возвращаемое значение
Каждое выражение datepart и его краткие формы возвращают одно и то же значение.
Возвращаемое значение зависит от языка среды, задаваемого инструкцией SET LANGUAGE, и от параметра конфигурации сервера «язык по умолчанию» для имени входа. Если значение date является строковым литералом некоторого формата, то возвращаемое значение зависит от функции SET DATEFORMAT. SET DATEFORMAT не изменяет возвращаемое значение, если дата является выражением столбца с типом данных «дата» или «время».
Ниже представлена таблица соответствия аргументов функции datepart и значений, возвращенных выражением SELECT DATEPART(datepart,’2007-10-30 12:15:32.1234567 +05:10′) . Аргумент date имеет тип данных datetimeoffset(7) . Последние две позиции значения, возвращаемого функцией nanoseconddatepart, всегда 00 . Масштаб этого значения составляет 9.
.123456700
datepart | Возвращаемое значение |
---|---|
year, yyyy, yy | 2007 г. |
quarter, qq, q | 4 |
month, mm, m | 10 |
dayofyear, dy, y | 303 |
day, dd, d | 30 |
week, wk, ww | 44 |
weekday, dw | 3 |
hour, hh | 12 |
minute, n | 15 |
second, ss, s | 32 |
millisecond, ms | 123 |
microsecond, mcs | 123456 |
nanosecond, ns | 123456700 |
tzoffset, tz | 310 |
iso_week, isowk, isoww | 44 |
Аргументы функции datepart, содержащие информацию о номере недели и дня
Для week (wk, ww) или weekday (dw) datepart возвращаемое значение DATEPART зависит от значения, заданного функцией SET DATEFIRST.
1 января любого года определяет начальное число для компонента даты weekdatepart. Пример:
DATEPART (wk, ‘Jan 1, xxxx’) = 1,
где xxxx — любой год.
В этой таблице представлены возвращаемые значения параметров week и weekdaydatepart для даты 21.04.2007 с каждым аргументом функции SET DATEFIRST. 1 января 2007 г. приходится на понедельник. 21 апреля 2007 г. приходится на субботу. Для региональных настроек «Английский (США)»
SET DATEFIRST 7 — ( Sunday )
SET DATEFIRST 7 (воскресенье). После задания DATEFIRST используйте предлагаемую инструкцию SQL для табличных значений datepart:
SELECT DATEPART(week, ‘2007-04-21 ‘), DATEPART(weekday, ‘2007-04-21 ‘)
Аргументы функции datepart, отображающие год, месяц и день даты
Значения, возвращаемые в результате выполнения инструкций DATEPART (year, date), DATEPART (month, date) и DATEPART (day, date), совпадают с результатами выполнения функций YEAR, MONTH и DAY, соответственно.
iso_week datepart
Стандарт ISO 8601 включает в себя систему отсчета дней и недель ISO. Каждая неделя приписывается тому году, в котором находится ее четверг. Например, первая неделя 2004 г. (2004W01) считается с понедельника 29 декабря 2003 г. по воскресенье 4 января 2004 г. Европейские страны и регионы обычно используют этот стиль нумерирования. Неевропейские страны или регионы обычно не используют его.
Примечание. Наибольшее число недель в году может составлять 52 или 53.
Система отсчета недель в разных странах и регионах может не совпадать со стандартом ISO. В таблице ниже представлено шесть возможных вариантов.
tzoffset
DATEPART возвращает значение tzoffset (tz) как количество минут (со знаком). В результате выполнения этой инструкции возвращается смещение часового пояса 310 минут:
SELECT DATEPART (tzoffset, '2007-05-10 00:00:01.1234567 +05:10');
Функция DATEPART отображает значение tzoffset описанным ниже образом.
- Для datetimeoffset и datetime2 значение tzoffset возвращает временное смещение в минутах, причем для datetime2 смещение всегда равно 0 минут.
- Для типов данных, которые могут быть неявно преобразованы в datetimeoffset или datetime2, функция DATEPART возвращает временное смещение в минутах. Для остальных типов даты и времени этого не происходит.
- Для параметров любых других типов возвращается ошибка.
Аргумент даты типа smalldatetime
Для значения date типа smalldatetime функция DATEPART возвращает количество секунд 00.
Возвращается значение по умолчанию для аргумента функции datepart, который отличен от даты
Если тип данных аргумента date не содержит указанной части datepart, функция DATEPART вернет значение по умолчанию для этой части datepart, только если для date указан литерал.
Например, значение «год-месяц-день» по умолчанию для любого типа данных date равно 1900-01-01. Приведенная ниже инструкция содержит аргументы компонентов даты для datepart, аргумент времени для date и возвращает 1900, 1, 1, 1, 2 .
SELECT DATEPART(year, '12:10:30.123') ,DATEPART(month, '12:10:30.123') ,DATEPART(day, '12:10:30.123') ,DATEPART(dayofyear, '12:10:30.123') ,DATEPART(weekday, '12:10:30.123');
Если аргумент date указан как переменная или столбец таблицы и тип данных этой переменной или столбца не содержит указанной части datepart, функция DATEPART возвращает ошибку 9810. В этом примере переменная @t имеет тип данных time. Этот пример завершается ошибкой, потому что год даты не является допустимым для типа данных time:
DECLARE @t time = '12:10:30.123'; SELECT DATEPART(year, @t);
Доли секунды
Эти инструкции демонстрируют, что функция DATEPART возвращает доли секунды:
SELECT DATEPART(millisecond, '00:00:01.1234567'); -- Returns 123 SELECT DATEPART(microsecond, '00:00:01.1234567'); -- Returns 123456 SELECT DATEPART(nanosecond, '00:00:01.1234567'); -- Returns 123456700
Remarks
Функция DATEPART может использоваться в предложениях выбора из списка, WHERE, HAVING, GROUP BY и ORDER BY.
DATEPART неявно приводит строковые литералы к типу datetime2 в SQL Server 2008 (10.0.x) и более поздних версиях. Это означает, что DATENAME не поддерживает формат ГЧМ (год, число, месяц) при передаче даты в виде строки. Для использования формата ГЧМ (год, число, месяц) необходимо явно привести строку к типу datetime или smalldatetime.
Примеры
В этом примере возвращается базовый год. Его значение используется при расчетах, связанных с датами. В примере дата указана как число. Обратите внимание на то, что SQL Server интерпретирует 0 как 1 января 1900 г.
SELECT DATEPART(year, 0), DATEPART(month, 0), DATEPART(day, 0); -- Returns: 1900 1 1
В приведенном ниже примере возвращается часть даты 12/20/1974 , представляющая день.
-- Uses AdventureWorks SELECT TOP(1) DATEPART (day,'12/20/1974') FROM dbo.DimCustomer; -- Returns: 20
В приведенном ниже примере возвращается часть даты 12/20/1974 , представляющая год.
-- Uses AdventureWorks SELECT TOP(1) DATEPART (year,'12/20/1974') FROM dbo.DimCustomer; -- Returns: 1974
Как вытащить дату из datetime 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 , которая первым аргументом принимает единицу измерения, в которой нужно вернуть разницу между двумя временными значениями.
MySQLTIMESTAMPDIFF(YEAR, '2003-07-03 14:10:26', NOW());