Данные типа даты и времени в SQL Server 2008 (ADO.NET)
В 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. В приведенной ниже таблице перечислены разделы, посвященные дате и времени, для конкретных версий SQL Server.
SQL Server 2000 |
SQL Server 2005 |
SQL Server 2008 |
---|---|---|
Типы данных даты и времени и только даты, появившиеся в 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 с добавлением смещения часового пояса. Смещение часового пояса представлено в виде [+|-] ЧЧ:ММ. ЧЧ — это 2 разряда от 00 до 14, представляющие количество часов в смещении часового пояса. ММ — это 2 разряда от 00 до 59, представляющие количество дополнительных минут в смещении часового пояса. Форматы времени поддерживаются с точностью до 100 наносекунд. Обязательный знак «+» или «-» указывает, нужно ли прибавить смещение часового пояса ко времени в формате UTC (универсальное время или время по Гринвичу) или отнять его, чтобы получить местное время. |
Примечание |
---|
Если параметру Type System Version в строке подключения явным образом не присвоено значение SQL Server 2008 или Latest, значения datetime будут обрабатываться с использованием системы типов SQL Server 2005 по умолчанию.Дополнительные сведения об использовании ключевых слов Type System Version см. в разделе Новые возможности SQL Server 2008 (ADO.NET). |
Формат даты и порядок даты
Способ синтаксического разбора сервером SQL Server значений даты и времени зависит не только от версии системы типов и версии сервера, но также от установленных на сервере по умолчанию языковых параметров и параметров форматирования. Строка даты, подходящая для форматов даты на одном языке, может не распознаваться, если запрос выполняется в подключении, в котором используется другой язык и другой формат даты.
Инструкция Transact-SQL SET LANGUAGE неявным образом задает значение параметра DATEFORMAT, определяющего порядок компонентов даты. Инструкцию Transact-SQL SET DATEFORMAT можно использовать в подключении для устранения неоднозначности значений даты путем расположения компонентов даты в порядке МДГ, ДМГ, ГМД, ГДМ, МГД или ДГМ.
Если значение параметра DATEFORMAT для подключения не указано, SQL Server использует связанный с подключением язык по умолчанию. Например, строка даты '01/02/03' будет интерпретирована как МДГ (2 января 2003 г.), если на сервере установлен английский язык (США), и как ДМГ (1 февраля 2003 г.), если на сервере установлен английский язык (Великобритания). Год определяется по правилу отсечения двух цифр года SQL Server, которое определяет дату отсечения для выбора века. Дополнительные сведения см. в разделе Параметр отсечения двух цифр года электронной документации по SQL Server.
Примечание |
---|
Формат даты ГДМ не поддерживается при преобразовании из строкового формата в формат date, time, datetime2 или datetimeoffset. |
Дополнительные сведения об интерпретации сервером SQL Server даты и времени см. в разделе Использование данных даты и времени электронной документации по SQL Server 2008.
Параметры и типы данных даты и времени
Можно указать тип данных SqlParameter с помощью одного из перечислений SqlDbType. Для поддержки новых типов данных даты и времени к SqlDbType были добавлены следующие перечисления.
SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet
Также можно указать тип объекта 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 |
---|---|---|---|
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, соответствующие типам данных даты и времени.
Свойство |
Описание |
---|---|
Возвращает или задает значение, указывающее, можно ли использовать значения NULL. При отправке на сервер параметра со значением NULL необходимо указывать значение DBNull, а не значение null (Nothing в Visual Basic). Дополнительные сведения о значении NULL базы данных см. в разделе Обработка значений Null (ADO.NET) |
|
Возвращает или задает максимальное количество разрядов, используемых для представления значения. Этот параметр пропускается для типов данных даты и времени. |
|
Возвращает или задает число десятичных разрядов, до которых разрешается промежуток времени для Time, DateTime2 и DateTimeOffset. Значение по умолчанию — 0, означающее, что фактический масштаб выводится из значения и отправляется на сервер. |
|
Пропускается для типов данных даты и времени. |
|
Возвращает или задает значение параметра. |
|
Возвращает или задает значение параметра. |
Примечание |
---|
Значения времени, меньшие нуля или большие либо равные 24 часам, приводят к вызову исключения ArgumentException. |
Создание параметров
Объект SqlParameter можно создать с помощью конструктора либо путем добавления этого объекта в коллекцию SqlCommand Parameters путем вызова метода Add класса SqlParameterCollection. Метод Add принимает в качестве входных данных либо аргументы конструктора, либо существующий объект параметра.
В следующих подразделах данного раздела приведены примеры указания параметров даты и времени. Дополнительные примеры по работе с параметрами см. в разделах Настройка параметров и типов данных параметров (ADO.NET) и Параметры DataAdapter (ADO.NET).
Пример работы с типом 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, содержащего дату, время и смещение часового пояса, равное 0.
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 |
---|---|
DateTime |
SqlDbType.DateTime |
TimeSpan |
SqlDbType.Time |
DateTimeOffset |
SqlDbType.DateTimeOffset |
Извлечение данных даты и времени
В следующей таблице описаны методы, используемые для извлечения значений даты и времени SQL Server 2008.
Метод SqlClient |
Описание |
---|---|
Возвращает значение указанного столбца в виде структуры DateTime. |
|
Возвращает значение указанного столбца в виде структуры DateTimeOffset. |
|
Возвращает базовый тип поля, зависящий от поставщика. Возвращает те же типы, что и метод GetFieldType для новых типов даты и времени. |
|
Возвращает значение указанного столбца. Возвращает те же типы, что и GetValue для новых типов даты и времени. |
|
Извлекает значения из указанного массива. |
|
Возвращает значение столбца в виде SqlString. Если данные нельзя выразить в виде объекта SqlString, возникнет исключение InvalidCastException. |
|
Возвращает данные столбца в качестве значений по умолчанию SqlDbType. Возвращает те же типы, что и GetValue для новых типов даты и времени. |
|
Извлекает значения из указанного массива. |
|
Возвращает значение столбца в виде строки, если Type System Version имеет значение «SQL Server 2000» или «SQL Server 2005». Если данные нельзя представить в виде строки, то возникнет исключение InvalidCastException. |
|
Возвращает значение указанного столбца в виде структуры Timespan. |
|
Возвращает значение указанного столбца в виде базового типа CLR. |
|
Возвращает значения столбца в массив. |
|
Возвращает объект DataTable, описывающий метаданные результирующего набора. |
Примечание |
---|
Новые типы даты и времени SqlDbTypes не поддерживаются для кода, выполняющегося в SQL Server внутри процесса.При передаче на сервер одного из этих типов возникает исключение. |
Указание значений даты и времени в виде литералов
Типы данных даты и времени можно указать с помощью множества различных форматов строк литералов, которые SQL Server затем оценивает во время выполнения, преобразуя их во внутренние структуры даты и времени. SQL Server распознает данные даты и времени, заключенные в апострофы ('). В приведенных ниже примерах демонстрируются некоторые форматы.
Алфавитные форматы даты, например 'October 15, 2006'.
Численные форматы даты, например '10/15/2006'.
Строковые форматы без разделителей, например строка '20061015', которую можно интерпретировать как 15 октября 2006 г. при использовании стандартного формата даты ISO.
Примечание |
---|
Полную документацию по всем литеральным строковым форматам и другим возможностям типов данных даты и времени можно найти в электронной документации по SQL Server. |
Значения времени, меньшие нуля или большие либо равные 24 часам, приводят к вызову исключения ArgumentException.
Ресурсы электронной документации по SQL Server 2008
Дополнительные сведения о работе со значениями даты и времени в SQL Server 2008 см. в приведенных ниже ресурсах электронной документации по SQL Server 2008.
Раздел |
Описание |
---|---|
Приводятся общие сведения обо всех типах данных и функциях даты и времени в языке Transact-SQL. |
|
Приводятся сведения о типах данных даты и времени, функциях для работы с этими типами данных и примеры их использования. |
|
Описываются системные типы данных в SQL Server 2008. |
См. также
Основные понятия
Сопоставления типов данных SQL Server (ADO.NET)
Настройка параметров и типов данных параметров (ADO.NET)