date (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure даAzure Synapse Analytics даПараллельное хранилище данных

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

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

Свойство Значение
Синтаксис date
Использование DECLARE @MyDate date

CREATE TABLE Таблица1 ( Столбец1 date )
Формат строковых литералов по умолчанию

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

Дополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.
Диапазон От 0001-01-01 до 9999-12-31 (от 1582-10-15 до 9999-12-31 для Informatica)

От 1 января 1 года до 31 декабря 9999 года нашей эры (от 15 октября 1582 года до 31 декабря 9999 года для Informatica).
Диапазоны элементов ГГГГ обозначает 4 цифры, которые представляют год и принимают значения от 0001 до 9999. Для Informatica значение ГГГГ ограничено диапазоном от 1582 до 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.

Примечание. Для Informatica значение ГГГГ ограничено диапазоном от 1582 до 9999.

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

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

Формат гдм не поддерживается для типа данных date.
Алфавитный формат Описание
мес [дд][,] гггг

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

мес гггг [дд]

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

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

дд [гг]гг мес

[дд] гггг мес

гггг мес [дд]

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

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

Если не указано число месяца, подразумевается первое число месяца.
ISO 8601 Описание
ГГГГ-ММ-ДД

ГГГГММДД
То же, что и стандарт SQL. Этот формат является единственным международным стандартом.
Без разделителей Описание
[гг]ггммдд

гггг[мм][дд]
Данные типа date могут быть определены с помощью четырех, шести или восьми цифр. Строка из шести или восьми цифр всегда интерпретируется как гмд. На месяц и день всегда должно приходиться по две цифры. Строка из четырех цифр воспринимается как значение года.
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.

Примечание

Для Informatica диапазон ограничен интервалом от 1582-10-15 (15 октября 1582 г.) до 9999-12-31 (31 декабря 9999  г.).

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

Некоторые клиенты нижнего уровня не поддерживают типы данных 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).

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

В этом разделе описывается, что происходит при преобразовании типа данных 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

Впервые представлено в SQL Server 2008.

См. также раздел

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