date (Transact-SQL)

Определяет дату в SQL Server.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Описание типа данных date

Свойство

Значение

Синтаксис

date

Использование

DECLARE @MyDate date

CREATE TABLE Таблица1 (столбец1 date )

Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)

ГГГГ-ММ-ДД

Дополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.

Диапазон

От 0001-01-01 до 9999-12-31

От 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры.

Диапазоны элементов

ГГГГ обозначает 4 цифры, которые представляют год и принимают значения от 0001 до 9999.

ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12.

ДД обозначает две цифры, представляющие день указанного месяца и принимающие значения от 01 до 31 в зависимости от месяца.

Длина в символах

10 позиций

Точность, масштаб

10, 0

Объем памяти

3 байта, фиксированный

Структура хранилища

Дата хранится в одной переменной типа integer размером 1 или 3 байта.

Точность

Один день

Значение по умолчанию

1900-01-01

Данное значение используется как присоединяемая часть даты при неявном преобразовании данных типа time в значение типа datetime2 или datetimeoffset.

Календарь

Григорианский

Определяемая пользователем точность в долях секунды

Нет

Учет и сохранение смещения часового пояса

Нет

Учет перехода на летнее время

Нет

Поддерживаемые форматы строковых литералов для типа данных date

В следующей таблице перечислены допустимые форматы строковых литералов для типа данных date.

Числовой

Описание

mdy                         

[м]м/дд/[гг]гг       

[м]м-дд-[гг]гг       

[м]м.дд.[гг]гг       

мгд                         

мм/[гг]гг/дд       

мм-[гг]гг/дд       

[м]м.[гг]гг.дд       

дмг                         

дд/[м]м/[гг]гг       

дд-[м]м-[гг]гг       

дд.[м]м.[гг]гг       

дгм                         

дд/[гг]гг/[м]м       

дд-[гг]гг-[м]м       

дд.[гг]гг.[м]м       

гмд                         

[гг]гг/[м]м/дд       

[гг]гг-[м]м-дд       

[гг]гг-[м]м-дд       

Сочетания [м]м, дд и [гг]гг представляют в строке месяц, день и год, разделенные символом косой черты (/), дефисом (-) или точкой (.).

Поддерживаются только двух- и четырехзначные форматы записи года. Для записи года рекомендуется всегда использовать четырехзначный формат. Чтобы указать целое число в промежутке от 0001 до 9999, отображающее пороговое значение года при преобразовании двухзначной записи в четырехзначную, необходимо использовать Настройка параметра конфигурации сервера two digit year cutoff.

Если двузначное число, обозначающее год, меньше или равно двузначному числу из последних двух цифр порогового года, год относится к тому же столетию, что и пороговый год. Если двузначное число, обозначающее год, больше двузначного числа из последних двух цифр порогового года, год относится к столетию, которое предшествует столетию порогового года. Например, если пороговое значение года для двухзначной записи равно 2049, то год, обозначенный двумя цифрами 49, интерпретируется как 2049, а год, обозначенный двумя цифрами 50, интерпретируется как 1950.

Формат даты по умолчанию определяется текущими настройками языковых стандартов. Формат даты можно изменить с помощью инструкций SET LANGUAGE и SET DATEFORMAT.

Формат ydm (гдм) не поддерживается для типа данных date.

Алфавитный формат

Описание

мес [дд][,] гггг      

мес дд[,] [гг]гг      

мес гггг [дд]          

[дд] мес[,] гггг      

дд мес[,] [гг]гг       

дд [гг]гг мес         

[дд] гггг мес         

гггг мес [дд]         

гггг [дд] мес         

Значение mon (мес) означает полное или сокращенное название месяца на текущем языке. Запятые являются необязательными, регистр букв не учитывается.

Во избежание неоднозначности используйте четырехзначную запись года.

Если не указано число месяца, подразумевается первое число месяца.

ISO 8601

Описание

ГГГГ-ММ-ДД            

ГГГГММДД               

То же, что и стандарт SQL. Является единственным международным стандартом.

Без разделителей

Описание

[гг]ггммдд            

гггг[мм][дд]          

Данные типа date могут задаваться с помощью четырех, шести или восьми цифр. Строка из шести или восьми знаков всегда интерпретируется как ymd (гмд). На месяц и день всегда должно приходиться по две цифры. Строка из четырех цифр воспринимается как значение года.

ODBC

Описание

{ д 'гггг-мм-дд' }   

Зависит от API-интерфейса ODBC.

Формат W3C XML

Описание

гггг-мм-ддTZD      

Специально введен для использования в XML и SOAP.

TZD обозначает часовой пояс (в виде номера или смещения +чч:мм и -чч:мм):

  • «чч:мм» обозначает смещение часового пояса. чч — двузначное число от 0 до 14, представляющее количество часов в смещении часового пояса.

  • Обозначение «мм» состоит из двух цифр, представляющих дополнительное смещение часового пояса в минутах, и принимает значения от 0 до 59.

  • + (плюс) или – (минус) представляет собой обязательный знак смещения часового пояса. Данный знак указывает, добавляется или вычитается смещение часового пояса от времени в формате UTC, чтобы получить локальное время. Допустимый диапазон смещения часового пояса: от -14:00 до +14:00.

Соответствие стандартам ANSI и ISO 8601

date соответствует стандартному определению ANSI SQL для григорианского календаря: «Замечание 85 — Данные типа Datetime позволяют хранить даты григорианского календаря в виде чисел диапазона от 0001–01–01 CE до 9999–12–31 CE».

Формат строковых литералов по умолчанию, используемый для клиентов низкого уровня, соответствует стандарту SQL, в котором он определен как ГГГГ-ММ-ДД. Данный формат аналогичен определению даты в стандарте ISO 8601.

Обратная совместимость для клиентов нижнего уровня

Некоторые клиенты низкого уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset. В следующей таблице показано сопоставление типов экземпляра более высокого уровня SQL Server и клиентов низкого уровня.

Тип данных SQL Server

Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня

ODBC низкого уровня

OLEDB низкого уровня

JDBC низкого уровня

SQLCLIENT низкого уровня

time

чч:мм:сс[. ннннннн]

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

date

ГГГГ-ММ-ДД

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

datetime2

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн]

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

datetimeoffset

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн] [+|-]чч:мм

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

Преобразование данных типа Date и Time

При преобразовании в типы данных даты и времени SQL Server отвергает все значения, которые он не распознает как значения даты или времени. Дополнительные сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в разделе Функции CAST и CONVERT (Transact-SQL)

Тип данных, в который выполняется преобразование

Дополнительные сведения о преобразовании

time(n)

Преобразование завершается ошибкой 206: «Конфликт типов операндов: тип date несовместим с типом time».

datetime

Дата копируется, а для компонента времени устанавливается значение «00:00:00.000». Следующий код демонстрирует результаты преобразования значения date в значение datetime.

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

Если значение типа date находится в диапазоне значений smalldatetime, компонент даты копируется, а для компонента времени устанавливается значение 00:00:00. Если значение date выходит за диапазон значений smalldatetime, выводится сообщение об ошибке 242: «Преобразование типа данных date в тип данных smalldatetime привело к появлению значения, выходящего за диапазон допустимых значений». После этого для значения типа smalldatetime устанавливается значение NULL.

Следующий код демонстрирует результаты преобразования значения date в значение smalldatetime.

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

Дата копируется, для времени устанавливается значение 00:00.0000000 +00:00.

Следующий код демонстрирует результаты преобразования значения date в значение datetimeoffset(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

Компонент даты копируется, а для компонента времени устанавливается значение «00:00:00.00» независимо от значения (n).

Следующий код демонстрирует результаты преобразования значения date в значение datetime2(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.00
--
--(1 row(s) affected)

Преобразование даты в другие типы данных даты и времени

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

Тип данных, в который выполняется преобразование

Дополнительные сведения о преобразовании

time(n)

Преобразование завершается ошибкой 206: «Конфликт типов операндов: тип date несовместим с типом time».

datetime

Дата копируется. Следующий код демонстрирует результаты преобразования значения date в значение datetime.

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

Если значение типа date находится в диапазоне значений smalldatetime, компонент даты копируется, а для компонента времени устанавливается значение 00:00:00.000. Если значение date выходит за диапазон значений smalldatetime, выводится сообщение об ошибке 242: «Преобразование типа данных date в тип данных smalldatetime привело к появлению значения, выходящего за диапазон допустимых значений». После этого для значения типа smalldatetime устанавливается значение NULL.

Следующий код демонстрирует результаты преобразования значения date в значение smalldatetime.

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

Дата копируется, для времени устанавливается значение 00:00.0000000 +00:00.

Следующий код демонстрирует результаты преобразования значения date в значение datetimeoffset(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

Компонент даты копируется, для компонента времени устанавливается значение 00:00.000000.

Следующий код демонстрирует результаты преобразования значения date в значение datetime2(3).

DECLARE @date date = '1912-10-25'
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)

Преобразование строковых литералов в дату

Преобразование строковых литералов в типы данных даты и времени разрешается, если все части строк записаны в допустимом формате. Иначе возникает ошибка времени выполнения. Явные или скрытые преобразования, в которых не задан стиль преобразования типов данных даты и времени в строковые литералы, будут проведены в формате по умолчанию для текущего сеанса. В следующей таблице приводятся правила преобразования строковых литералов в типы данных date.

Строковый литерал входа

date

ODBC DATE

Строковые литералы ODBC сопоставляются с типом данных datetime. Любая операция присваивания литералов ODBC DATETIME типу данных date вызывает неявное преобразование между данным типом и типом datetime согласно правилам преобразования.

ODBC TIME

См. предыдущее правило ODBC DATE.

ODBC DATETIME

См. предыдущее правило ODBC DATE.

только DATE

Простейший.

только TIME

Указаны значения по умолчанию.

только TIMEZONE

Указаны значения по умолчанию.

DATE + TIME

Используется компонент DATE входной строки.

DATE + TIMEZONE

Не допускается.

TIME + TIMEZONE

Указаны значения по умолчанию.

DATE + TIME + TIMEZONE

Используется компонент DATE локального значения DATETIME.

Примеры

В следующем примере сравниваются результаты приведения строкового типа к каждому из типов данных date и time.

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 
        'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 
        'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 
        'datetimeoffset';

Ниже приводится результирующий набор.

Тип данных

Вывод

time

12:35:29. 1234567

date

2007-05-08

smalldatetime

2007-05-08 12:35:00

datetime

2007-05-08 12:35:29.123

datetime2

2007-05-08 12:35:29. 1234567

datetimeoffset

2007-05-08 12:35:29.1234567 +12:15

См. также

Справочник

Функции CAST и CONVERT (Transact-SQL)