Данные "Дата и время"
В 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. |