sql начало дня даты
Типы данных и функции даты и времени (Transact-SQL)
В разделах этой статьи представлен обзор всех типов данных и функций даты и времени Transact-SQL.
Типы данных даты и времени
Типы данных даты и времени Transact-SQL перечислены в следующей таблице:
Тип данных | Формат | Диапазон | Точность | Объем памяти (в байтах) | Определяемая пользователем точность в долях секунды | Смещение часового пояса |
---|---|---|---|---|---|---|
time | чч:мм:сс[.ннннннн] | От 00:00:00.0000000 до 23:59:59.9999999 | 100 наносекунд | от 3 до 5 | Да | Нет |
date | ГГГГ-ММ-ДД | От 0001-01-01 до 31.12.99 | 1 день | 3 | Нет | Нет |
smalldatetime | ГГГГ-ММ-ДД чч:мм:сс | От 01.01.1900 до 06.06.2079 | 1 минута | 4 | нет | Нет |
datetime | ГГГГ-ММ-ДД чч:мм:сс[.ннн] | От 01.01.1753 до 31.12.9999 | 0,00333 секунды | 8 | Нет | Нет |
datetime2 | ГГГГ-ММ-ДД чч:мм:сс[.ннннннн] | От 0001-01-01 00:00:00.0000000 до 9999-12-31 23:59:59.9999999 | 100 наносекунд | От 6 до 8 | Да | Нет |
datetimeoffset | ГГГГ-ММ-ДД чч:мм:сс[.ннннннн] [+|-]чч:мм | От 0001-01-01 00:00:00.0000000 до 9999-12-31 23:59:59.9999999 (время в формате UTC) | 100 наносекунд | От 8 до 10 | Да | Да |
Тип данных Transact-SQL rowversion не относится к типам данных даты и времени. Тип данных timestamp является устаревшим синонимом rowversion.
Функции даты и времени
В следующих таблицах приводятся функции даты и времени Transact-SQL. Дополнительные сведения о детерминизме см. в статье Детерминированные и недетерминированные функции.
Функции, возвращающие значения системной даты и времени
Transact-SQL наследует все значения системной даты и времени от операционной системы компьютера, на котором работает экземпляр SQL Server.
Высокоточные функции системной даты и времени
SQL Server 2019 (15.x) получает значения даты и времени с помощью функции GetSystemTimeAsFileTime() Windows API. Точность зависит от физического оборудования и версии Windows, в которой запущен экземпляр SQL Server. Точность возвращаемых значений этого API-интерфейса задана равной 100 нс. Точность может быть определена с помощью метода GetSystemTimeAdjustment() API-интерфейса Windows.
DATEPART (Transact-SQL)
Эта функция возвращает целое число, представляющее указанную часть datepart заданного типа date.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса 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.
Тип возвращаемых данных
Возвращаемое значение
Каждое выражение datepart и его краткие формы возвращают одно и то же значение.
Возвращаемое значение зависит от языка среды, задаваемого инструкцией SET LANGUAGE, и от параметра конфигурации сервера «язык по умолчанию» для имени входа. Если значение date является строковым литералом некоторого формата, то возвращаемое значение зависит от функции SET DATEFORMAT. Инструкция SET DATEFORMAT не изменяет возвращаемое значение, если дата представляется выражением столбца типа данных даты или времени.
.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 января любого года определяет начальное число для компонента даты week datepart. Пример:
DATEPART (wk, ‘Jan 1, xxx x’) = 1,
где xxxx — любой год.
В этой таблице представлены возвращаемые значения параметров week и weekday datepart для даты 21.04.2007 с каждым аргументом функции SET DATEFIRST. 1 января 2007 г. приходится на понедельник. 21 апреля 2007 г. приходится на субботу. Для региональных настроек «Английский (США)»
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 января, 1–7 дней года | Да | США | ||||||||||||||||||||||||||||||||||||||||||
Понедельник | 1 января, 1–7 дней года | Да | Большинство стран Европы, а также Великобритания | ||||||||||||||||||||||||||||||||||||||||||
Понедельник | 4 января, 4–7 дней года | нет | ISO 8601, Норвегия и Швеция | ||||||||||||||||||||||||||||||||||||||||||
Понедельник | 7 января, 7 дней года | нет | |||||||||||||||||||||||||||||||||||||||||||
Среда | 1 января, 1–7 дней года | Да | |||||||||||||||||||||||||||||||||||||||||||
Суббота | 1 января,tzoffsetDATEPART возвращает значение tzoffset (tz) как количество минут (со знаком). В результате выполнения этой инструкции возвращается смещение часового пояса 310 минут: Функция DATEPART отображает значение tzoffset описанным ниже образом. Аргумент даты типа smalldatetimeДля значения date типа smalldatetime функция DATEPART возвращает количество секунд 00. Возвращается значение по умолчанию для аргумента функции datepart, который отличен от датыЕсли тип данных аргумента date не содержит указанной части datepart, функция DATEPART вернет значение по умолчанию для этой части datepart, только если для date указан литерал. Если аргумент date указан как переменная или столбец таблицы и тип данных этой переменной или столбца не содержит указанной части datepart, функция DATEPART возвращает ошибку 9810. В этом примере переменная @t имеет тип данных time. Этот пример завершается ошибкой, потому что год даты не является допустимым для типа данных time: Доли секундыЭти инструкции демонстрируют, что функция DATEPART возвращает доли секунды: RemarksФункция DATEPART может использоваться в предложениях выбора из списка, WHERE, HAVING, GROUP BY и ORDER BY. В SQL Server 2019 (15.x) функция DATEPART неявно приводит строковые литералы к типу datetime2. Это означает, что DATENAME не поддерживает формат ГЧМ (год, число, месяц) при передаче даты в виде строки. Для использования формата ГЧМ (год, число, месяц) необходимо явно привести строку к типу datetime или smalldatetime. ПримерыВ этом примере возвращается базовый год. Его значение используется при расчетах, связанных с датами. В примере дата указана как число. Обратите внимание на то, что SQL Server интерпретирует 0 как 1 января 1900 г. SQL функции даты и времениПриветствую Вас, уважаемые читатели блога webcodius.ru. В базе данных часто требуется хранить различные данные связанные с датой и временем. Это может быть дата добавления информации, дата регистрации пользователя, время последней автоизации и другие данные. В языке SQL есть множество функций связанных с датой и временем, сегодня их и рассмотрим. Все ниже рассмотренные функции работают с календарными типами данных. Получение текущей даты и времени.Чтобы получить текущую дату и время используется функция NOW (). SELECT NOW () Для получения только текущей даты есть функция CURDATE (). SELECT CURDATE () И функция CURTIME (), которая возвращает только текущее время: SELECT CURTIME () Функции CURDATE () и NOW () удобно использовать для добавления в базу данных записей, для которых требуется хранить дату добавления. Например, при добавлении статьи на сайт хорошо бы хранить ее дату публикации. Тогда запрос на добавление статьи в базу будет примерно таким: INSERT INTO posts (id_post, text_post, date_publication) VALUES (1, ‘текст статьи’, NOW ()); Прибавление и вычитание дат и времениФункция ADDDATE (date, INTERVAL value) прибавляет к дате date значение value и возвращает полученное значение. В качестве value могут выступать следующие значения: а также их комбинации: SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL 1 DAY) SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL ‘3 1:20’ DAY_MINUTE) SELECT SUBDATE (‘2015-09-28 10:30:20’, INTERVAL 20 HOUR) Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример: SELECT PERIOD_ADD (201509, 4) SELECT TIMESTAMPADD (QUARTER, 1, ‘2015-09-28’) Функция SUBTIME (date, time) вычитает из даты date время time. Пример: SELECT SUBTIME (‘2015-09-28 10:30:20′, ’50:20:19’) Вычисление интервала между датамиФункция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример: SELECT DATEDIFF (‘2015-09-28 00:00:20’, ‘2015-09-27 23:40:20’) С помощью этой функции легко определить сколько дней прошло с даты публикации статьи: SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1 SELECT PERIOD_DIFF (201509, 201501) SELECT TIMESTAMPDIFF (HOUR, ‘2015-09-28 10:30:20’, ‘2015-09-28 19:50:20’) Получение различных форматов даты и времени и другой информацииФункция DATE (datetime) возвращает дату, отсекая время. Пример: SELECT DATE (‘2015-09-28 10:30:20’) Функция TIME (datetime) возвращает время, отсекая дату. Пример: SELECT TIME (‘2015-09-28 10:30:20’) TIMESTAMP (‘2015-09-28’) DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример: SELECT DAY (‘2015-09-28’), DAYOFMONTH (‘2015-09-28’) Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример: SELECT DAYNAME (‘2015-09-28’), DAYOFWEEK (‘2015-09-28’), WEEKDAY (‘2015-09-28’) Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример: SELECT WEEK (‘2015-09-28 10:30:20’), WEEKOFYEAR (‘2015-09-28 10:30:20’) Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример: SELECT MONTH (‘2015-09-28 10:30:20’), MONTHNAME (‘2015-09-28 10:30:20’) Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример: SELECT QUARTER (‘2015-09-28 10:30:20’) Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример: SELECT YEAR (‘2015-09-28 10:30:20’) Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер: SELECT DAYOFYEAR (‘2015-09-28 10:30:20’) Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример: SELECT HOUR (‘2015-09-28 10:30:20’) Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример: SELECT MINUTE (‘2015-09-28 10:30:20’) Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример: SELECT SECOND (‘2015-09-28 10:30:20’) SELECT EXTRACT (YEAR FROM ‘2015-09-28 10:30:20’), EXTRACT (MONTH FROM ‘2015-09-28 10:30:20’), EXTRACT (DAY FROM ‘2015-09-28 10:30:20’), EXTRACT (HOUR FROM ‘2015-09-28 10:30:20’), EXTRACT (MINUTE FROM ‘2015-09-28 10:30:20’), EXTRACT (SECOND FROM ‘2015-09-28 10:30:20’) Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример: SELECT TO_DAYS (‘2015-09-28 10:30:20’), FROM_DAYS (736234) Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример: SELECT UNIX_TIMESTAMP (‘2015-09-28 10:30:20’), FROM_UNIXTIME (1443425420) Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример: SELECT TIME_TO_SEC (’10:30:20′), SEC_TO_TIME (37820) Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример: SELECT MAKEDATE (2015, 271) Функции для работы с датами и временемПоддержка часовых поясов timeZoneВозвращает часовой пояс сервера. Синтаксис Возвращаемое значение toTimeZoneСинтаксис Аргументы Возвращаемое значение Пример timeZoneOfВозвращает название часового пояса для значений типа DateTime и DateTime64. Синтаксис Аргументы Возвращаемое значение Пример timeZoneOffsetВозвращает смещение часового пояса в секундах от UTC. Функция учитывает летнее время и исторические изменения часовых поясов, которые действовали на указанную дату. Синтаксис Аргументы Возвращаемое значение Пример toYearПереводит дату или дату-с-временем в число типа UInt16, содержащее номер года (AD). toQuarterПереводит дату или дату-с-временем в число типа UInt8, содержащее номер квартала. toMonthПереводит дату или дату-с-временем в число типа UInt8, содержащее номер месяца (1-12). toDayOfYearПереводит дату или дату-с-временем в число типа UInt16, содержащее номер дня года (1-366). toDayOfMonthПереводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в месяце (1-31). toDayOfWeektoHourtoMinuteПереводит дату-с-временем в число типа UInt8, содержащее номер минуты в часе (0-59). toSecondПереводит дату-с-временем в число типа UInt8, содержащее номер секунды в минуте (0-59). toUnixTimestampСинтаксис Возвращаемое значение Пример toStartOfYearОкругляет дату или дату-с-временем вниз до первого дня года. toStartOfISOYeartoStartOfQuartertoStartOfMonthОкругляет дату или дату-с-временем вниз до первого дня месяца. Возвращаемое значение для некорректных дат зависит от реализации. ClickHouse может вернуть нулевую дату, выбросить исключение, или выполнить «естественное» перетекание дат между месяцами. toMondayОкругляет дату или дату-с-временем вниз до ближайшего понедельника. toStartOfWeek(t[,mode])Округляет дату или дату со временем до ближайшего воскресенья или понедельника в соответствии с mode. toStartOfDayОкругляет дату-с-временем вниз до начала дня. Возвращается дата-с-временем. toStartOfHourОкругляет дату-с-временем вниз до начала часа. toStartOfMinuteОкругляет дату-с-временем вниз до начала минуты. toStartOfSecondОтсекает доли секунды. Синтаксис Аргументы Возвращаемое значение Примеры Пример без часового пояса: Пример с часовым поясом: Смотрите также toStartOfFiveMinuteОкругляет дату-с-временем вниз до начала пятиминутного интервала. toStartOfTenMinutesОкругляет дату-с-временем вниз до начала десятиминутного интервала. toStartOfFifteenMinutesОкругляет дату-с-временем вниз до начала пятнадцатиминутного интервала. toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone])toTimeПереводит дату-с-временем на некоторую фиксированную дату, сохраняя при этом время. toRelativeYearNumПереводит дату-с-временем или дату в номер года, начиная с некоторого фиксированного момента в прошлом. toRelativeQuarterNumПереводит дату-с-временем или дату в номер квартала, начиная с некоторого фиксированного момента в прошлом. toRelativeMonthNumПереводит дату-с-временем или дату в номер месяца, начиная с некоторого фиксированного момента в прошлом. toRelativeWeekNumПереводит дату-с-временем или дату в номер недели, начиная с некоторого фиксированного момента в прошлом. toRelativeDayNumПереводит дату-с-временем или дату в номер дня, начиная с некоторого фиксированного момента в прошлом. toRelativeHourNumПереводит дату-с-временем в номер часа, начиная с некоторого фиксированного момента в прошлом. toRelativeMinuteNumПереводит дату-с-временем в номер минуты, начиная с некоторого фиксированного момента в прошлом. toRelativeSecondNumПереводит дату-с-временем в номер секунды, начиная с некоторого фиксированного момента в прошлом. toISOYearПереводит дату-с-временем или дату в число типа UInt16, содержащее номер ISO года. ISO год отличается от обычного года, потому что в соответствии с ISO 8601:1988 ISO год начинается необязательно первого января. Пример toISOWeekПример toWeek(date[, mode][, timezone])Переводит дату-с-временем или дату в число UInt8, содержащее номер недели. Второй аргументам mode задает режим, начинается ли неделя с воскресенья или с понедельника и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент mode опущен, то используется режим 0. Описание режимов (mode):
Для режимов со значением «с 4 или более днями в этом году» недели нумеруются в соответствии с ISO 8601:1988: Если неделя, содержащая 1 января, имеет 4 или более дней в новом году, это неделя 1. Для режимов со значением «содержит 1 января», неделя 1 – это неделя содержащая 1 января. Не имеет значения, сколько дней в новом году содержала неделя, даже если она содержала только один день. Пример toYearWeek(date[,mode])Возвращает год и неделю для даты. Год в результате может отличаться от года в аргументе даты для первой и последней недели года. Аргумент mode работает точно так же, как аргумент mode toWeek(). Если mode не задан, используется режим 0. Пример date_truncОтсекает от даты и времени части, меньшие чем указанная часть. Синтаксис Аргументы unit — единица измерения времени, в которой задана отсекаемая часть. String Literal. value — дата и время. DateTime или DateTime64. Возвращаемое значение Примеры Запрос без указания часового пояса: Запрос с указанием часового пояса: Смотрите также date_addДобавляет интервал времени или даты к указанной дате или дате со временем. Синтаксис Аргументы unit — единица измерения времени, в которой задан интервал для добавления. String. value — значение интервала для добавления. Int. Возвращаемое значение Пример date_diffВычисляет разницу между двумя значениями дат или дат со временем. Синтаксис Аргументы unit — единица измерения времени, в которой будет выражено возвращаемое значение функции. String. Возвращаемое значение Пример date_subВычитает интервал времени или даты из указанной даты или даты со временем. Синтаксис Аргументы unit — единица измерения времени, в которой задан интервал для вычитания. String. value — значение интервала для вычитания. Int. Возвращаемое значение Пример timestamp_addДобавляет интервал времени к указанной дате или дате со временем. Синтаксис Аргументы unit — единица измерения времени, в которой задан интервал для добавления. String. Возвращаемое значение Пример timestamp_subВычитает интервал времени из указанной даты или даты со временем. Синтакис Аргументы unit — единица измерения времени, в которой задан интервал для вычитания. String. value — значение интервала для вычитания. Int. Возвращаемое значение Пример Возвращает текущую дату и время. Синтаксис Параметры Возвращаемое значение Пример Запрос без указания часового пояса: Запрос с указанием часового пояса: todayВозвращает текущую дату на момент выполнения запроса. Функция не требует аргументов. yesterdaytimeSlottimeSlots(StartTime, Duration,[, Size])toYYYYMMПереводит дату или дату со временем в число типа UInt32, содержащее номер года и месяца (YYYY * 100 + MM). toYYYYMMDDПереводит дату или дату со временем в число типа UInt32, содержащее номер года, месяца и дня (YYYY * 10000 + MM * 100 + DD). toYYYYMMDDhhmmssПереводит дату или дату со временем в число типа UInt64 содержащее номер года, месяца, дня и время (YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss). formatDateTimeФункция преобразует дату-и-время в строку по заданному шаблону. Важно: шаблон — константное выражение, поэтому использовать разные шаблоны в одной колонке не получится. Синтаксис Возвращаемое значение Возвращает значение времени и даты в определенном вами формате. Поля подстановки Пример dateNameВозвращает указанную часть даты. Синтаксис Аргументы Возвращаемое значение Пример FROM_UNIXTIMEФункция преобразует Unix timestamp в календарную дату и время. Примеры Если указан только один аргумент типа Integer, то функция действует так же, как toDateTime, и возвращает тип DateTime. В случае, когда есть два аргумента: первый типа Integer или DateTime, а второй является строкой постоянного формата — функция работает также, как formatDateTime, и возвращает значение типа String.
|