Как извлечь из 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.
Как убрать время из даты 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 для преобразования даты в нужный формат. В любом случае, при использовании функций для изменения формата даты, следует учитывать особенности используемой СУБД и настроек сервера.
DATEPART (Transact-SQL)
Эта функция возвращает целое число, представляющее указанную часть datepart заданного типа date.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
DATEPART ( datepart , date )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
datepart
Определенная часть аргумента date, для которого функция DATEPART вернет значение типа integer. В приведенной ниже таблице перечислены все допустимые аргументы datepart.
DATEPART не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.
datepart | Abbreviations |
---|---|
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. В таблице ниже представлено шесть возможных вариантов.
Первый день недели | Содержание первой недели года | Двойное присвоение недель | Применяется в: |
---|---|---|---|
Воскресенье | 1 января, |
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
Замечания
Функция 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 (Transact-SQL)
Определяет дату, включающую время дня с долями секунды в 24-часовом формате.
Используйте для новых проектов типы данных time, date, datetime2 и datetimeoffset. Эти типы соответствуют стандарту языка SQL. Их проще переносить на другие платформы. Типы time, datetime2 и datetimeoffset обеспечивают большую точность секунд. datetimeoffset обеспечивает поддержку часовых поясов для приложений, развертываемых по всему миру.
Описание
Свойство | Значение |
---|---|
Синтаксис | datetime |
Использование | DECLARE @MyDatetime datetime |
ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12.
Обозначение ДД состоит из двух цифр, представляющих день указанного месяца, и принимает значения от 01 до 31 в зависимости от месяца.
Обозначение чч состоит из двух цифр, представляющих час, и принимает значения от 00 до 23.
Обозначение мм состоит из двух цифр, представляющих минуту, и принимает значения от 00 до 59.
Обозначение сс состоит из двух цифр, представляющих секунду, и принимает значения от 00 до 59.
Поддерживаемые форматы строковых литералов для типа данных datetime
В представленных ниже таблицах приводятся поддерживаемые форматы строковых литералов для типа данных datetime. За исключением ODBC, строковые литералы типа datetime заключаются в одинарные кавычки (‘), например ‘string_literaL’. Если язык среды не us_english, строковые литералы должны иметь формат N’string_literaL’.
число разделитель число разделитель число [время] [время]
При использовании языковой настройки us_english порядком по умолчанию для даты является mdy (МДГ). Порядок даты можно изменить с помощью инструкции SET DATEFORMAT.
Некоторые рекомендации по применению алфавитных форматов даты:
1. Заключайте дату и время в одинарные кавычки (‘). Для всех языков, кроме английского, используйте «N’».
2. Символы, заключенные в квадратные скобки, являются необязательными.
3. Если указать две последние цифры года, значения, меньшие двух последних цифр значения параметра конфигурации сервера two digit year cutoff, будут относиться к столетию года усечения. Значения, большие или равные двум последним цифрам этого параметра, относятся к столетию, предшествующему столетию года усечения. Например, если значение параметра two digit year cutoff равно 2050 (по умолчанию), то год, обозначенный двумя цифрами 25, интерпретируется как 2025, а год, обозначенный двумя цифрами 50, — как 1950. Во избежание неоднозначности используйте четырехзначную запись года.
4. Если не указано число месяца, подразумевается первое число месяца.
Чтобы использовать формат ISO 8601, необходимо указать каждый элемент в этом формате, включая T, двоеточие (:) и точку (.), которые отображаются в этом формате.
Квадратные скобки показывают, что доли секунд не являются обязательными. Временной компонент указан в 24-часовом формате.
Символ T указывает на начало временной части значения datetime.
Без разделителей | Описание |
---|---|
ГГГГММДД чч:мм:сс[.ммм] |
Escape-последовательности меток времени ODBC имеют следующий формат: < literal_type ‘constant_value‘ >:
— literal_type определяет тип escape-последовательности. Метки времени имеют три описателя literal_type:
1) d = только дата
2) t = только время
3) ts = метка времени (время + дата)
Округление типа данных datetime до долей секунды
Значения типа datetime округляются в большую сторону до 0,000, 0,003 или 0,007 секунды, как показано в таблице, представленной ниже.
Указанное пользователем значение | Значение, хранимое системой |
---|---|
01/01/98 23:59:59.999 | 1998-01-02 00:00:00.000 |
01/01/98 23:59:59.995 |
Соответствие стандартам ANSI и ISO 8601
datetime не удовлетворяет стандартам ANSI и ISO 8601.
Преобразование данных типа Date и Time
При преобразовании в типы данных даты и времени SQL Server отбрасывает все значения, которые не распознаются как значения даты или времени. Сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в статье Функции CAST и CONVERT (Transact-SQL).
Преобразование других типов даты и времени в тип данных datetime
В этом разделе описывается, что происходит при преобразовании других типов даты и времени в тип данных datetime.
При преобразовании из типа date копируются год, месяц и день. Для компонента времени устанавливается значение 00:00:00.000. Следующий код демонстрирует результаты преобразования значения date в значение datetime .
DECLARE @date date = '12-21-16'; DECLARE @datetime datetime = @date; SELECT @datetime AS '@datetime', @date AS '@date'; --Result --@datetime @date ------------------------- ---------- --2016-12-21 00:00:00.000 2016-12-21
В приведенном выше примере используется формат даты, зависящий от региона (ММ-ДД-ГГ).
DECLARE @date date = '12-21-16';
Вы можете обновить пример в соответствии с форматом вашего региона.
Вы также можете дополнить пример форматом даты, соответствующим стандарту ISO 8601 (ГГГГ-ММ-ДД). Пример:
DECLARE @date date = '2016-12-21'; DECLARE @datetime datetime = @date; SELECT @datetime AS '@datetime', @date AS '@date';
При преобразовании из time(n) компонент времени копируется, а для компонента даты устанавливается значение 1900-01-01. Если точность в долях секунды значения time(n) больше трех цифр, значение будет усечено. Следующий пример показывает результаты преобразования значения time(4) в значение datetime .
DECLARE @time time(4) = '12:10:05.1237'; DECLARE @datetime datetime = @time; SELECT @datetime AS '@datetime', @time AS '@time'; --Result --@datetime @time ------------------------- ------------- --1900-01-01 12:10:05.123 12:10:05.1237
При преобразовании из типа smalldatetime копируются часы и минуты. Секунды и доли секунд устанавливаются в значение 0. Следующий код демонстрирует результаты преобразования значения smalldatetime в значение datetime .
DECLARE @smalldatetime smalldatetime = '12-01-16 12:32'; DECLARE @datetime datetime = @smalldatetime; SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime'; --Result --@datetime @smalldatetime ------------------------- ----------------------- --2016-12-01 12:32:00.000 2016-12-01 12:32:00
При преобразовании из типа datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Если точность в долях секунды для значения datetimeoffset(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения datetimeoffset(4) в значение datetime .
DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0'; DECLARE @datetime datetime = @datetimeoffset; SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset'; --Result --@datetime @datetimeoffset ------------------------- ------------------------------ --1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0
При преобразовании из типа datetime2(n) копируются дата и время. Если точность в долях секунды для значения datetime2(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения datetime2(4) в значение datetime .
DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237'; DECLARE @datetime datetime = @datetime2; SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2'; --Result --@datetime @datetime2 ------------------------- ------------------------ --1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
Примеры
В приведенном ниже примере сравниваются результаты приведения строкового типа к каждому из типов данных date и time.
SELECT CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 'smalldatetime' ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 'datetime2' ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 'datetimeoffset';
Тип данных | Выходные данные |
---|---|
time | 12:35:29. 1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |