Данные даты и времени

В SQL Server 2008 появились новые типы данных для обработки сведений о дате и времени. Новые типы данных включают в себя отдельные типы для даты и времени, а также расширенные типы данных с более высоким диапазоном, точностью и поддержкой часовых поясов. Начиная с .NET Framework 3.5 с пакетом обновления 1 (SP1), поставщик данных .NET Framework для SQL Server (System.Data.SqlClient) полностью поддерживает все новые возможности ядра СУБД SQL Server 2008. Для использования новых возможностей с SqlClient необходимо установить .NET Framework 3.5 с пакетом обновления 1 (SP1) или более поздней версии.

В версиях SQL Server, выпущенных до SQL Server 2008, было только два типа данных для работы с датами и временем: datetime и smalldatetime. Оба типа данных содержат как значение даты, так и значение времени, затрудняя работу только со значениями даты или времени. Кроме того, эти типы данных поддерживают только даты, наступившие после представления григорианского календаря в Англии в 1753 году. Другое ограничение заключается в том, что эти устаревшие типы данных не учитывают часовой пояс. Это затрудняет работу с данными, которые берутся из разных часовых поясов.

Дополнительные сведения о типах даты и времени в SQL Server см. в разделе "Типы данных даты и времени" и "Функции".

Типы данных даты и времени и только даты, появившиеся в SQL Server 2008

В приведенной ниже таблице описаны новые типы данных даты и времени.

Тип данных SQL Server Description
date Тип данных date имеет диапазон от 1 января 01 года до 31 декабря 9999 года с точностью до дня. По умолчанию применяется значение 1 января 1900 г. Размер при хранении составляет 3 байта.
time Тип данных time сохраняет только значения времени, основанные на 24-часовом формате. Тип данных time имеет диапазон от 00:00:00.0000000 до 23:59:59.9999999 с точностью 100 наносекунд. Значение по умолчанию равно 00:00:00.0000000 (полночь). Тип данных time поддерживает определяемую пользователем точность в долях секунды, и размер хранения изменяется от 3 до 6 байт в зависимости от указанной точности.
datetime2 Тип данных datetime2 объединяет параметры диапазона и точности типов данных date и time в единый тип.

Значения по умолчанию и форматы строковых литералов совпадают с типами данных date и time.
datetimeoffset Тип данных datetimeoffset обладает всеми характеристиками типа datetime2 с добавлением смещения часового пояса. Смещение часового пояса представлено как [+|-] HH:MM. ЧЧ — двузначное число от 00 до 14, представляющее количество часов в смещении часового пояса. Обозначение ММ состоит из двух цифр, представляющих дополнительное смещение часового пояса в минутах, и принимает значения от 00 до 59. Форматы времени поддерживаются с точностью до 100 наносекунд. Обязательный знак "+" или "-" указывает, добавлено ли или вычтено смещение часового пояса из времени в формате UTC (по Гринвичу) для получения местного времени.

Примечание.

Дополнительные сведения об использовании Type System Version см. в разделе ConnectionString.

Формат даты и порядок даты

То, как SQL Server анализирует значения даты и времени, зависит не только от версии системы типов и версии сервера, но также от параметров языка и формата по умолчанию для сервера. Строка даты, которая подходит для форматов даты одного языка, может быть нераспознаваемой, если запрос выполняется подключением, в котором используются другие язык и формат даты.

Инструкция Transact-SQL SET LANGUAGE неявно устанавливает DATEFORMAT, который определяет порядок частей даты. Вы можете использовать инструкцию SET DATEFORMAT Transact-SQL в подключении для устранения неоднозначности значений даты путем упорядочения частей даты в порядке МДГ, ДМГ, ГМД, ГДМ, МГД или ДГМ.

Если вы не укажете DATEFORMAT для подключения, SQL Server использует связанный с этим подключением язык по умолчанию. Например, строка даты "01/02/03" будет интерпретироваться как МДГ (2 января 2003 г.) на сервере с заданным языком "английский (США)" и как ДМГ (1 февраля 2003 г.) на сервере с заданным языком "английский (Великобритания)". Год определяется с помощью правила порогового года SQL Server, которое определяет пороговую дату для назначения значения столетия. Дополнительные сведения см. в разделе "Вариант отсечения двухзначного года".

Примечание.

Формат даты ГДМ не поддерживается при преобразовании из формата строки в date, time, datetime2 или datetimeoffset.

Дополнительные сведения о том, как SQL Server интерпретирует данные даты и времени, см. в разделе "Использование данных даты и времени".

Параметры и типы данных даты-времени

Для поддержки новых типов данных даты и времени к свойству SqlDbType были добавлены следующие значения перечисления.

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffSet

Можно указать тип данных SqlParameter с помощью одного из предшествующих перечислений SqlDbType.

Примечание.

Вы не можете установить для свойства DbType параметра SqlParameter значение SqlDbType.Date.

Также можно указать тип объекта SqlParameter в общей форме, задав для свойства DbType объекта SqlParameter особое значение перечисления DbType. Для поддержки типов данных datetime2 и datetimeoffset к свойству DbType были добавлены следующие значения перечисления.

  • DbType.DateTime2.

  • DbType.DateTimeOffset.

Новые перечисления дополняют перечисления Date, Time и DateTime из предыдущих версий .NET Framework.

Тип поставщика данных платформы .NET Framework объекта параметра выводится из значения типа платформы .NET Framework объекта параметра или из свойства DbType объекта параметра. Для поддержки новых типов данных даты и времени не введено новых типов данных System.Data.SqlTypes. В приведенной ниже таблице описаны сопоставления между типами данных даты и времени SQL Server 2008 и типами данных CLR.

Тип данных SQL Server Тип .NET Framework System.Data.SqlDbType System.Data.DbType
Дата System.DateTime Дата Дата
Время System.TimeSpan Время Время
datetime2 System.DateTime datetime2 datetime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Свойства SqlParameter

В приведенной ниже таблице описаны свойства SqlParameter, которые относятся к типам данных даты и времени.

Свойство Description
IsNullable Возвращает или задает допустимость значений NULL. Во время отправки значения NULL на сервер нужно указать DBNull, а не null (Nothing в Visual Basic). Дополнительные сведения о значении NULL базы данных см. в разделе Handling Null Values.
Precision Возвращает или задает максимальное количество цифр, используемых для представления значения. Этот параметр не учитывается для типов данных даты и времени.
Scale Возвращает или задает число десятичных разрядов, до которых разрешается промежуток времени для Time, DateTime2 и DateTimeOffset. Значение по умолчанию равно 0. Это означает, что фактический масштаб выводится из значения и отправляется на сервер.
Size Не учитывается для типов данных даты и времени.
Value Возвращает или задает значение параметра.
SqlValue Возвращает или задает значение параметра.

Примечание.

Значения времени, которые меньше нуля, больше или равны 24 часам, вызовут исключение ArgumentException.

Создание параметров

Объект SqlParameter можно создать с помощью конструктора либо путем добавления этого объекта в коллекцию SqlCommandParameters путем вызова метода Add класса SqlParameterCollection. Метод Add будет принимать в качестве входных данных аргументы конструктора либо имеющийся объект параметра.

В следующих разделах этой статьи приведены примеры того, как указать параметры даты и времени. Дополнительные примеры работы с параметрами см. в разделе "Настройка параметров" и "Типы данных параметров" и "Параметры DataAdapter".

Пример работы с типом date

В приведенном ниже фрагменте кода демонстрируется, как указать параметр date.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Date";  
parameter.SqlDbType = SqlDbType.Date;  
parameter.Value = "2007/12/1";  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Date"  
parameter.SqlDbType = SqlDbType.Date  
parameter.Value = "2007/12/1"  

Пример работы с типом time

В приведенном ниже фрагменте кода демонстрируется, как указать параметр time.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@time";  
parameter.SqlDbType = SqlDbType.Time;  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Time"  
parameter.SqlDbType = SqlDbType.Time  
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;  

Пример работы с типом Datetime2

В приведенном ниже фрагменте кода показано, как указать параметр datetime2 с частями даты и времени.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@Datetime2";  
parameter.SqlDbType = SqlDbType.DateTime2;  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@Datetime2"  
parameter.SqlDbType = SqlDbType.DateTime2  
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");  

Пример работы с типом DateTimeOffSet

В приведенном ниже фрагменте кода показано, как указать параметр DateTimeOffSet с датой, временем и смещением часового пояса равным нулю.

SqlParameter parameter = new SqlParameter();  
parameter.ParameterName = "@DateTimeOffSet";  
parameter.SqlDbType = SqlDbType.DateTimeOffSet;  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  
Dim parameter As New SqlParameter()  
parameter.ParameterName = "@DateTimeOffSet"  
parameter.SqlDbType = SqlDbType.DateTimeOffSet  
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");  

AddWithValue

Вы также можете указать параметры, используя метод AddWithValue элемента SqlCommand, как показано в приведенном ниже фрагменте кода. Однако метод AddWithValue не позволяет указывать свойство DbType или SqlDbType для параметра.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("16660902"));  
command.Parameters.AddWithValue( _  
    "@date", DateTimeOffset.Parse("16660902"))  

Параметр @date можно сопоставить типу данных date, datetime или datetime2 на сервере. При работе с новыми типами данных datetime необходимо явно установить для свойства параметра SqlDbType тип данных экземпляра. Использование Variant или неявное предоставление значений параметров может вызвать проблемы с обратной совместимостью с типами данных datetime и smalldatetime.

В приведенной ниже таблице показано, какие типы SqlDbTypes выводятся из типов CLR.

Тип среды CLR Выводимый тип SqlDbType
Дата/время SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Извлечение данных даты и времени

В следующей таблице описаны методы, используемые для получения значений даты и времени SQL Server 2008.

Метод SqlClient Description
GetDateTime Извлекает значение указанного столбца в виде структуры DateTime.
GetDateTimeOffset Извлекает значение указанного столбца в виде структуры DateTimeOffset.
GetProviderSpecificFieldType Возвращает для поля тип, являющийся базовым типом конкретного поставщика. Возвращает для новых типов даты и времени те же типы, что и GetFieldType.
GetProviderSpecificValue Возвращает значение указанного столбца. Возвращает для новых типов даты и времени те же типы, что и GetValue.
GetProviderSpecificValues Извлекает значения в указанном массиве.
GetSqlString Извлекает значение столбца как тип SqlString. InvalidCastException возникает, если данные нельзя выразить в виде SqlString.
GetSqlValue Извлекает данные столбца в качестве SqlDbType по умолчанию. Возвращает для новых типов даты и времени те же типы, что и GetValue.
GetSqlValues Извлекает значения в указанном массиве.
GetString Возвращает значение столбца в виде строки, если Type System Version имеет значение SQL Server 2005. InvalidCastException возникает, если данные нельзя выразить в качестве строки.
GetTimeSpan Извлекает значение указанного столбца в виде структуры TimeSpan.
GetValue Извлекает значение указанного столбца в виде базового типа CLR.
GetValues Извлекает значения столбцов в массиве.
GetSchemaTable Возвращает класс DataTable, описывающий метаданные результирующего набора.

Примечание.

Новые дата и время SqlDbTypes не поддерживаются для кода, выполняющегося в процессе на SQL Server. Если один из этих типов будет передан на сервер, возникнет исключение.

Указание значений даты и времени в виде литералов

Вы можете указать типы данных даты и времени, используя множество различных форматов строк литералов, которые SQL Server затем оценивает во время выполнения, преобразовывая их во внутренние структуры даты и времени. SQL Server распознает данные даты и времени, заключенные в одинарные кавычки ('). Некоторые форматы продемонстрированы в следующих примерах.

  • Буквенные форматы даты, такие как 'October 15, 2006'.

  • Числовые форматы даты, такие как '10/15/2006'.

  • Неразделенные форматы строк, например строка '20061015', которая будет интерпретироваться как 15 октября 2006 г., если вы используете формат даты по стандарту ISO.

Значения времени, которые меньше нуля, больше или равны 24 часам, вызовут исключение ArgumentException.

Ресурсы документации ПО SQL Server

Дополнительные сведения о работе со значениями даты и времени в SQL Server см. в следующих статьях.

Статья Описание
Типы данных и функции даты и времени (Transact-SQL) Приводятся общие сведения обо всех типах данных и функциях даты и времени в языке Transact-SQL.
Использование данных даты и времени Приводятся сведения и даются примеры использования функций и типов данных даты и времени.
Типы данных (Transact-SQL) Описывает системные типы данных в SQL Server.

См. также