Типы данных и функции даты и времени (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 2008 (10.0.x) ядро СУБД получает значения даты и времени с помощью API Windows GetSystemTimeAsFileTime(). Точность зависит от физического оборудования и версии Windows, в которой запущен экземпляр SQL Server. Точность возвращаемых значений этого API-интерфейса задана равной 100 нс. Точность может быть определена с помощью метода GetSystemTimeAdjustment() API-интерфейса Windows.
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм SYSDATETIME SYSDATETIME ( ) Возвращает значение типа datetime2(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Возвращаемое значение не содержит смещение часового пояса. datetime2(7) Недетерминированная SYSDATETIMEOFFSET SYSDATETIMEOFFSET ( ) Возвращает значение типа datetimeoffset(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Возвращаемое значение содержит смещение часового пояса. datetimeoffset(7) Недетерминированная SYSUTCDATETIME SYSUTCDATETIME ( ) Возвращает значение типа datetime2(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Функция возвращает значения даты и времени в формате UTC. datetime2(7) Недетерминированная Функции системной даты и времени меньшей точности
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм CURRENT_TIMESTAMP CURRENT_TIMESTAMP Возвращает значение типа datetime, которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Возвращаемое значение не содержит смещение часового пояса. datetime Недетерминированная GETDATE GETDATE ( ) Возвращает значение типа datetime, которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Возвращаемое значение не содержит смещение часового пояса. datetime Недетерминированная GETUTCDATE GETUTCDATE ( ) Возвращает значение типа datetime, которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Функция возвращает значения даты и времени в формате UTC. datetime Недетерминированная Функции, возвращающие компоненты даты и времени
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм DATE_BUCKET DATE_BUCKET ( datepart, number, date, origin ) Возвращает значение даты и времени, соответствующее началу каждого контейнера даты и времени, из временной метки, определенной параметром origin или исходным значением по умолчанию 1900-01-01 00:00:00.000 , если параметр orgin не указан. Тип возвращаемого значения зависит от типа аргумента, переданного в параметре date. Недетерминированная DATENAME DATENAME ( datepart, date ) Возвращает строку символов, представляющую указанную часть datepart заданного типа date. nvarchar Недетерминированная DATEPART DATEPART ( datepart, date ) Возвращает целое число, представляющее указанную часть datepart заданного типа date. int Недетерминированная DATETRUNC DATETRUNC ( datepart, date ) Эта функция возвращает входную дату date, усеченную до указанной части datepart. Тип возвращаемого значения зависит от типа аргумента, переданного в параметре date. Недетерминированная DAY DAY ( date ) Возвращает целое число, представляющее часть дня указанного типа date. int Детерминированный MONTH MONTH ( date ) Возвращает целое число, представляющее часть месяца указанного типа date. int Детерминированный YEAR YEAR ( date ) Возвращает целое число, представляющее часть года указанного типа date. int Детерминированный Функции, возвращающие значения даты и времени из их компонентов
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм DATEFROMPARTS DATEFROMPARTS ( year, month, day ) Возвращает значение date, соответствующее указанному числу, месяцу и году. date Детерминированный DATETIME2FROMPARTS DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision) Возвращает значение datetime2, соответствующее указанной дате и времени с заданной точностью. datetime2(precision) Детерминированный DATETIMEFROMPARTS DATETIMEFROMPARTS ( year, month, day, hour, minute, seconds, milliseconds) Возвращает значение datetime, соответствующее указанной дате и времени. datetime Детерминированный DATETIMEOFFSETFROMPARTS DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision) Возвращает значение datetimeoffset для указанных даты и времени с указанными смещением и точностью. datetimeoffset(precision) Детерминированный SMALLDATETIMEFROMPARTS SMALLDATETIMEFROMPARTS ( year, month, day, hour, minute ) Возвращает значение smalldatetime, соответствующее указанной дате и времени. smalldatetime Детерминированный TIMEFROMPARTS TIMEFROMPARTS ( hour, minute, seconds, fractions, precision ) Возвращает значение time, соответствующее указанному времени с заданной точностью. time(precision) Детерминированный Функции, возвращающие значения разности даты и времени
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм DATEDIFF DATEDIFF ( datepart, startdate, enddate ) Возвращает количество границ даты или времени datepart, пересекающихся между двумя указанными датами. int Детерминированный DATEDIFF_BIG DATEDIFF_BIG ( datepart, startdate, enddate ) Возвращает количество границ даты или времени datepart, пересекающихся между двумя указанными датами. bigint Детерминированный Функции, изменяющие значения даты и времени
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм DATEADD DATEADD (datepart, number, date ) Возвращает новое значение datetime, добавляя интервал к указанной части datepart заданной даты date. Тип данных аргумента date Детерминированный EOMONTH EOMONTH ( start_date [, month_to_add ] ) Возвращает последний день месяца, содержащего указанную дату, с необязательным смещением. Тип возвращаемого значения — это тип аргумента start_date или тип данных date. Детерминированный SWITCHOFFSET SWITCHOFFSET (DATETIMEOFFSET, time_zone) Функция SWITCHOFFSET изменяет смещение часового пояса для значения DATETIMEOFFSET и сохраняет значение UTC. Значение datetimeoffset с точностью в долях секунд, заданной в аргументе DATETIMEOFFSET Детерминированный TODATETIMEOFFSET TODATETIMEOFFSET (expression, time_zone) TODATETIMEOFFSET преобразует значение типа datetime2 в значение типа datetimeoffset. Функция TODATETIMEOFFSET преобразует значение datetime2 в местное время для указанного time_zone. Значение datetimeoffset с точностью в долях секунд, заданной в аргументе datetime Детерминированный Функции, устанавливающие или возвращающие функции формата сеанса
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм @@DATEFIRST @@DATEFIRST Возвращает текущее значение параметра SET DATEFIRST для сеанса. tinyint Недетерминированная SET DATEFIRST SET DATEFIRST < number | @number_var > Устанавливает первый день недели в виде числа от 1 до 7. Неприменимо Неприменимо SET DATEFORMAT SET DATEFORMAT < format | @format_var > Задает порядок составляющих даты (месяц/день/год) для ввода данных типа datetime или smalldatetime. Неприменимо Неприменимо @@LANGUAGE @@LANGUAGE Возвращает название использующегося в настоящий момент языка. @@LANGUAGE не является функцией даты или времени. Однако на данные, выводимые функциями даты, могут повлиять настройки языка. Неприменимо Неприменимо SET LANGUAGE SET LANGUAGE < [ N ] ‘language‘ | @language_var > Устанавливает языковую среду сеанса и системных сообщений. SET LANGUAGE не является функцией даты или времени. Однако на данные, выводимые функциями даты, влияет параметр языка. Неприменимо Неприменимо sp_helplanguage sp_helplanguage [ [ = ] ‘language‘ ] Возвращает сведения о формате даты всех поддерживаемых языков. sp_helplanguage не является хранимой процедурой даты или времени. Однако на данные, выводимые функциями даты, влияет параметр языка. Неприменимо Неприменимо Функции, проверяющие значения даты и времени
Функция Синтаксис Возвращаемое значение Тип возвращаемых данных Детерминизм ISDATE ISDATE ( expression ) Определяет, является ли входное выражение типа datetime или smalldatetime допустимым значением даты или времени. int Функция ISDATE детерминирована, только если используется совместно с функцией CONVERT и если заданный параметр стиля CONVERT не равен 0, 100, 9 или 109. Дата и время — см. также
Статья Описание FORMAT Возвращает значение в указанных формате и культуре (не обязательно). Для выполнения форматирования значения даты, времени и чисел с учетом локали в виде строк используется функция FORMAT. Функции CAST и CONVERT (Transact-SQL) Предоставляет сведения о преобразовании значений даты и времени в строковые литералы и обратно, а также в другие форматы даты и времени. Написание инструкций Transact-SQL, адаптированных к международному использованию Предоставляет рекомендации относительно переносимости баз данных и приложений баз данных, использующих инструкции Transact-SQL, с одного языка на другой или в многоязычную среду. Скалярные функции ODBC (Transact-SQL) Предоставляет сведения о скалярных функциях ODBC, которые могут использоваться в инструкциях Transact-SQL. К ним относятся функции даты и времени ODBC. AT TIME ZONE (Transact-SQL) Обеспечивает преобразование часовых поясов. См. также
- Функции
- Типы данных (Transact-SQL)
Обратная связь
Были ли сведения на этой странице полезными?
Выборка даты без времени
Подскажите запрос на выборку только даты из БД. Имеется строка в таблице формата TIMESTAMP 0000-0-0 00:00:00 , так вот как сделать что бы на экран выводилась только дата а не дата со временем .
Отслеживать
задан 17 янв 2013 в 9:47
1,665 5 5 золотых знаков 35 35 серебряных знаков 73 73 бронзовых знака4 ответа 4
Сортировка: Сброс на вариант по умолчанию
SELECT DATE_FORMAT( `date_field` , '%d %M %Y' ) AS `date_format` FROM `table_name`Отслеживать
ответ дан 17 янв 2013 в 10:01
34k 1 1 золотой знак 31 31 серебряный знак 49 49 бронзовых знаков
А как сделать чтоб %M — на русском выводило?)
7 мая 2018 в 12:05
@junior-web-dev, запрос перед этим сделайте: SET lc_time_names = ‘ru_RU’;
7 мая 2018 в 12:43SELECT DATE( some_field ) FROM some_table
Больше функций — красивых и разных.
Отслеживать
ответ дан 17 янв 2013 в 9:59
xEdelweiss xEdelweiss
9,114 17 17 серебряных знаков 31 31 бронзовый знакВ конце выбранного названия колонки дописать ::date, если я правильно вас понял.
Отслеживать
ответ дан 1 мар 2020 в 14:35Вот пример, чтоб было более понятно. select shipments.ship_date::date,customer_id,publication, type from shipments, editions, stock ORDER BY publication;
MS SQL Server: Убираем время из значения типа datetime
Этот текст является в какой то мере переводом топика Kevin Jones — Removing time from SQL datetime, так что если вы хорошо знаете английский, то лучше, наверное, читать руководство из первых рук. Правда, мой вариант дополнен некоторыми тестами.
Итак, мы довольно часто используем SQL сервер для хранения данных с типом дата и время. В SQL Server 2005/2000 существуют два типа данных (специальных типов данных) для хранения даты и времени – это datetime и smalldatetime, разница между ними в возможностях хранения (от и до), точности времени и, соответственно, в количестве используемой памяти. В SQL Server 2008 появились дополнительные типы данных, такие как datetime2, time, date, datetimeoffset, о них вы можете прочитать в статье на MSDN — Типы данных и функции даты и времени (Transact-SQL).
Вернемся же к типу DATETIME. Часто возникает необходимость выбрать из типа DATETIME только дату, а время установить равным 0:00. Не приходиться об этом думать, когда нужно просто вывести результат – тогда все можно сделать форматом вывода, например в C# это может быть “dd.MM.yyyy”. Другое дело, если с данными нужно еще оперировать (например, группировать по дате или что то прибавить или убавить), тогда нам необходим тип DATETIME, в котором нам нужно обнулять время.
Первый вариант, как можно это сделать (до прочтения топика Kevin Jones’а я так всегда и делал) – это привести изначально тип DATETIME в VARCHAR без времени (определенным форматом) и обратно:
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(15), GETDATE(), 101))Данный вариант достаточно часто встречается. Правда, от него могут быть проблемы в производительности, когда вы будите обрабатывать несколько тысяч строк и более.
Другой вариант, если вы используете SQL Server 2008 – это приводить DATETIME к упомянутому выше типу DATE:
SELECT CAST(GETDATE() AS DATE)Вы так же можете привести данный тип потом к DATETIME, если вам необходимо оперировать именно с этим типом.
И все же, если вы до сих пор используете SQL Server версии 2005, то лучше способ, чем описанный выше способ с VARCHAR – это приведение к типу FLOAT, вызов FLOOR (целое от числа), а затем приведение обратно к DATETIME:
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)Kevin Jones утверждает, что данные операции пройдут быстрее, аргументируя это тем, что во время приведения к типу VARCHAR и обратно SQL сервер еще задумывается о collation и о форматах. Когда же переводишь тип данных DATETIME к FLOAT, то целая часть числа – хранит информацию о дне, а дробная о времени. Использую функцию FLOAR мы берем только время. Кстати, с таким подходом легко, к примеру, сразу же прибавить день к дате.
Я в отличие от Kevin Jones попробовал все таки провести тест сравнения этих двух методов, правда использовав SQL Server 2008. Я написал следующий тест:
set nocount on go declare @date datetime, @i int declare @test table(d datetime) set @date = getdate() set @i = 0 -- заполняем тестовыми данными (10000001 строка с датами) while @iРезультат выполнения (в окне Messages):
Aug 10 2009 11:36:07
Aug 10 2009 11:37:15
Aug 10 2009 11:38:20То есть, разница всего то в 3-х секундах (Если поменять местами методы, то разницы вообще не будет). Итог: при еще большем объеме, может быть, это и сыграет роль, но в данном случае выигрыш не заметен. Потому вывод: данный способ (приведения к FLOAT и обратно) нужно взять на заметку и использовать в дальнейшем, но в данный момент не стоит переписывать существующий функционал, так как большого прироста производительности это не даст.
P.S. Может быть, в SQL Server 2000/2005 будут другие результаты? Или, может быть, в реальной жизни выигрыш будет?
UPDATE
Благодаря комментариям Ulugbek Umirov и Евгений Веприков из ветки блогов GotDotNet получены более честные результаты.
Было предложено использовать COUNT, а не чистый вывод в окно Managment Studio:
print convert(varchar(20), getdate(), 109) -- тестируем способ с VARCHAR select count(convert(datetime, convert(varchar(15), d, 101))) from @test print convert(varchar(20), getdate(), 109) -- тестируем способ с FLOAT select count(cast(floor(cast(d as float)) as datetime)) from @test print convert(varchar(20), getdate(), 109)И тогда результаты будут уже более значимыми:
Aug 11 2009 12:14:30
Aug 11 2009 12:14:38
Aug 11 2009 12:14:41Разница уже более чем в два раза.
Так же был предложен еще один метод by Ulugbek Umirov:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))Данный метод показывает лучше результаты на 2000 сервере, на 2005/2008 почти такой же.
See Also
Found a misprint? Feel free to send a Pull Request or open an issue.
Have a question about the post? You tried, something does not work? GitHub discussions.
Have question or feedback? Email me public@denis.gladkikh.email
The content on this site represents my own personal opinions and thoughts at the time of posting.
Content licensed under the Creative Commons CC BY 4.0.
Source code examples published with MIT License (if not mentioned in the post).
Нужно через sql запрос убрать дату из поля DataTime

Дорогие форумчане. Возникла новая проблема, на этот раз с выводом данных в DBGrid.
У меня есть поле "Время" в БД Access, оно типа Дата/Время и полу "Дата" того же типа.
При выводе данных в DBGrid полу дата имеет вид "01.01.2000" , а поле Время "01.01.2000 12:12:12".
Мне необходимо каким то образом убрать из поля время часть с датой. Но как.PS. Маска для поля время в БД стоит "Длинное время" но не помогает. Перерыл ИНЕТ, но так нечего и не понял ибо в SQL я слабоват.
SELECT [Учащийся],[Группа],[Процесс],[Дата],[Время],[Статус],[Преподаватель] FROM [Student],[IGroup],[Process],[Teacher] ' + 'WHERE ([Process].[IDStudent]=[Student].[IDStudent]) AND ([Student].[IDGroup]=[IGroup].[IDGroup]) AND ([Process].[IDTeacher]=[Teacher].[ID]) ' + 'ORDER BY [Дата] DESC'