Поделиться через


Данные типа даты и времени в SQL Server 2008 (ADO.NET)

Обновлен: November 2007

В 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

datetime и smalldatetime

Использование данных даты и времени

Использование данных даты и времени

Типы данных даты и времени, появившиеся в 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 (универсальное время или время по Гринвичу) или отнять его, чтобы получить местное время.

Bb675168.alert_note(ru-ru,VS.90).gifПримечание.

Если параметру 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.

Bb675168.alert_note(ru-ru,VS.90).gifПримечание.

Формат даты ГДМ не поддерживается при преобразовании из строкового формата в формат 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, соответствующие типам данных даты и времени.

Свойство

Описание

IsNullable

Возвращает или задает значение, указывающее, можно ли использовать значения NULL. При отправке на сервер параметра со значением NULL необходимо указывать значение DBNull, а не значение null (Nothing в Visual Basic). Дополнительные сведения о значении NULL базы данных см. в разделе Обработка значений Null (ADO.NET)

Precision

Возвращает или задает максимальное количество разрядов, используемых для представления значения. Этот параметр пропускается для типов данных даты и времени.

Scale

Возвращает или задает количество десятичных разрядов, до которых разрешается промежуток времени для Time, DateTime2,и DateTimeOffset. Значение по умолчанию — 0, означающее, что фактический масштаб выводится из значения и отправляется на сервер.

Size

Пропускается для типов данных даты и времени.

Value

Возвращает или задает значение параметра.

SqlValue

Возвращает или задает значение параметра.

Bb675168.alert_note(ru-ru,VS.90).gifПримечание.

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

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

Объект SqlParameter можно создать с помощью конструктора либо путем добавления этого объекта в коллекцию SqlCommandParameters путем вызова метода 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

Описание

GetDateTime

Возвращает значение указанного столбца в виде структуры DateTime.

GetDateTimeOffset

Возвращает значение указанного столбца в виде структуры DateTimeOffset.

GetProviderSpecificFieldType

Возвращает базовый тип поля, зависящий от поставщика. Возвращает те же типы, что и метод GetFieldType для новых типов даты и времени.

GetProviderSpecificValue

Возвращает значение указанного столбца. Возвращает те же типы, что и GetValue для новых типов даты и времени.

GetProviderSpecificValues

Извлекает значения из указанного массива.

GetSqlString

Возвращает значение столбца в виде SqlString. Если данные нельзя выразить в виде объекта SqlString, возникнет исключение InvalidCastException.

GetSqlValue

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

GetSqlValues

Извлекает значения из указанного массива.

GetString

Возвращает значение столбца в виде строки, если свойство «Type System Version» имеет значение «SQL Server 2000» или «SQL Server 2005». Если данные нельзя выразить в виде строки, возникнет исключение InvalidCastException.

GetTimeSpan

Возвращает значение указанного столбца в виде структуры Timespan.

GetValue

Возвращает значение указанного столбца в виде базового типа CLR.

GetValues

Возвращает значения столбца в массив.

GetSchemaTable

Возвращает объект DataTable, описывающий метаданные результирующего набора.

Bb675168.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

  • Алфавитные форматы даты, например 'October 15, 2006'.

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

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

Bb675168.alert_note(ru-ru,VS.90).gifПримечание.

Полную документацию по всем литеральным строковым форматам и другим возможностям типов данных даты и времени можно найти в электронной документации по SQL Server.

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

Ресурсы электронной документации по SQL Server 2008

Дополнительные сведения о работе со значениями даты и времени в SQL Server 2008 см. в приведенных ниже ресурсах электронной документации по SQL Server 2008.

Раздел

Описание

Типы данных и функции даты и времени (Transact-SQL)

Приводятся общие сведения обо всех типах данных и функциях даты и времени в языке Transact-SQL.

Использование данных даты и времени

Приводятся сведения о типах данных даты и времени, функциях для работы с этими типами данных и примеры их использования.

Типы данных (Transact-SQL)

Описываются системные типы данных в SQL Server 2008.

См. также

Основные понятия

Сопоставления типов данных SQL Server (ADO.NET)

Настройка параметров и типов данных параметров (ADO.NET)

Другие ресурсы

Типы данных SQL Server и ADO.NET