Язык

Данные "Дата и время"

В SQL Server 2008 были введены отдельные типы данных для даты и времени, а также типы данных с расширенными возможностями, обеспечивающими более широкий диапазон, повышенную точность и поддержку часовых поясов. Используйте пакет NuGet Microsoft.Data.SqlClient для доступа к этим типам данных из клиентских приложений. Для примеров в этой статье импортируйте Microsoft.Data.SqlClient и System.Data в C# или Visual Basic. Распространенные типы значений SQL остаются в System.Data.SqlTypes.

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

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

Типы данных даты и времени, представленные в SQL Server 2008

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

Тип данных SQL Server Описание
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 можно использовать в соединении для устранения неоднозначности значений даты, задав порядок частей даты как MDY, DMY, MYD, YMD, YDM или DYM.

Если для подключения не указано значение DATEFORMAT, SQL Server использует язык по умолчанию, связанный с этим подключением. Например, строка даты 01.02.03 будет интерпретирована как MDY (2 января 2003 г.) на сервере с языковым параметром английского языка (США) и как DMY (1 февраля 2003 г.) на сервере с языковым параметром британского английского языка. Год определяется с помощью правила порогового года SQL Server, которое определяет пороговую дату для назначения значения столетия. Дополнительные сведения см. в разделе Опция отсечения двухзначного года.

Примечание.

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

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

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

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

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

Чтобы указать тип данных для SqlParameter объекта, используйте одно из предыдущих SqlDbType значений перечисления.

Примечание.

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

Чтобы указать тип параметра универсально, задайте для свойства DbType значение перечисления DbType. Следующие значения поддерживают типы данных datetime2 и datetimeoffset:

  • 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
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

Свойства SqlParameter

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

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

Примечание.

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

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

Создайте объекты SqlParameter с помощью конструктора или вызовите метод Add для коллекции Parameters команды. Метод Add принимает аргументы конструктора или существующий объект параметра.

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

Пример 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.

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-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

Чтобы указать параметры, можно также вызвать AddWithValue для коллекции Parameters команды, как показано в следующем фрагменте кода. AddWithValue однако не позволяет указать DbType или SqlDbType для параметра.

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

Для этого значения DateTimeOffsetAddWithValue выводит SqlDbType.DateTimeOffset. Чтобы задать другой SQL Server тип даты или времени, задайте свойство параметра SqlDbType явным образом.

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

Тип CLR Определённый SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

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

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

Метод SqlClient Описание
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.

См. также