date (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в Microsoft Fabric

Определяет дату в SQL Server. Тип данных даты появился в SQL Server 2008 (10.0.x).

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

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

CREATE TABLE Table1 (Column1 DATE)
Формат строковых литералов по умолчанию

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

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

От 1 января 1 года до 31 декабря 9999 года нашей эры (от 15 октября 1582 года до 31 декабря 9999 года для Informatica).
Диапазоны элементов yyyy — четыре цифры от 0001 того, что 9999 представляет год. Informatica ограничивает yyyy диапазон 15829999.

MM — это две цифры от 0112 того, что представляет месяц в указанном году.

dd — две цифры от 0131месяца в зависимости от месяца, представляющего день указанного месяца.
Длина в символах 10 позиций
Точность, масштаб 10, 0
Объем памяти 3 байта, фиксированный
Структура хранилища одна 3-байтовая целочисленная дата хранения
Правильность Один день
Default value 1900-01-01

Это значение используется как присоединяемая часть даты при неявном преобразовании данных типа time в значение типа datetime2 или datetimeoffset.
Календарь Григорианский
Определяемая пользователем точность в долях секунды No
Учет и сохранение смещения часового пояса No
Учет перехода на летнее время No

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

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

Числовое Description
mdy

[m]m/dd/[yy]yy

[m]m-dd-[yy]yy

[m]m.dd.[yy]yy

myd

mm/[yy]yy/dd

mm-[yy]yy/dd

[m]m.[yy]yy.dd

dmy

dd/[m]m/[yy]yy

dd-[m]m-[yy]yy

dd.[m]m.[yy]yy

dym

dd/[yy]yy/[m]m

dd-[yy]yy-[m]m

dd.[yy]yy.[m]m

ymd

[yy]yy/[m]m/dd

[yy]yy-[m]m-dd

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

Поддерживаются только четыре цифры или двухзначные годы. Для записи года рекомендуется всегда использовать четырехзначный формат. Чтобы указать целое число от 00019999 того, что представляет отрезок года для интерпретации двухзначных лет в качестве четырехзначных лет, используйте параметр конфигурации сервера отсечения двухзначного года.

Примечание. Для Informatica ограничено yyyy диапазоном 15829999.

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

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

Формат ydm не поддерживается для даты.
В алфавитном порядке Description
mon [dd][,] yyyy

mon dd[,] [yy]

mon yyyy [dd]

[dd] mon[,] yyyy

dd mon[,][yy]yy

dd [yy]yy mon

[dd] yyyy mon

yyyy mon [dd]

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

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

Если не указано число месяца, подразумевается первое число месяца.
ISO 8601 Description
yyyy-MM-dd

yyyyMMdd
То же, что и стандарт SQL. Этот формат является единственным международным стандартом.
Без разделителей Description
[yy]yyMMdd

yyyy[MMdd]
Данные типа date могут быть определены с помощью четырех, шести или восьми цифр. Шестизначная или восьмизначная строка всегда интерпретируется как ymd. На месяц и день всегда должно приходиться по две цифры. Четырехзначная строка интерпретируется как год.
ODBC Description
{ d 'yyyy-MM-dd' } Зависит от API-интерфейса ODBC.
Формат W3C XML Description
yyyy-MM-ddTZD Введен для использования в XML и SOAP.

TZD— это конструктор часового пояса (Zили-hh:mm+hh:mm):

- hh:mm представляет смещение часового пояса. hh — две цифры, начиная от 014от , которые представляют количество часов в смещение часового пояса.
- mm — это две цифры, начиная от 059от , которые представляют количество дополнительных минут в смещение часового пояса.
- + (плюс) или - (минус) является обязательным признаком смещения часового пояса. Данный знак указывает, добавляется или вычитается смещение часового пояса от времени в формате UTC, чтобы получить локальное время. Допустимый диапазон смещения часового пояса — от-14:00.+14:00

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

Значение date соответствует стандартному определению ANSI SQL для григорианского календаря:

ПРИМЕЧАНИЕ 85. Типы данных Datetime позволяют хранить даты в григорианском формате в диапазоне дат 0001-01-01 CE до 9999-12-31 CE.

Формат строкового литерала по умолчанию, используемый для клиентов нижнего уровня, соответствует стандартной форме SQL, определенной как yyyy-MM-dd. Этот формат совпадает с определением ISO 8601 для DATE.

Примечание.

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

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

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

Тип данных SQL Server Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня ODBC низкого уровня OLEDB низкого уровня JDBC низкого уровня SQLCLIENT низкого уровня
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
date yyyy-MM-dd SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString

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

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

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

В этом разделе описывается, что происходит при преобразовании типа данных date в другие типы даты и времени.

При преобразовании в time(n)преобразование завершается ошибкой и возникает сообщение об ошибке 206:

Столкновение типов операнда: дата несовместима с временем.

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

DECLARE @date DATE = '12-10-25';
DECLARE @datetime DATETIME = @date;

SELECT @date AS '@date',
    @datetime AS '@datetime';

Результирующий набор:

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

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

Преобразование типа данных даты в типы данных smalldatetime привело к значению вне диапазона.

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

DECLARE @date DATE = '1912-10-25';
DECLARE @smalldatetime SMALLDATETIME = @date;

SELECT @date AS '@date',
    @smalldatetime AS '@smalldatetime';

Результирующий набор:

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

Для преобразования в datetimeoffset(n)дата копируется, а время — 00:00.0000000 +00:00. В следующем коде показаны результаты преобразования значения даты в значение datetimeoffset(3).

DECLARE @date DATE = '1912-10-25';
DECLARE @datetimeoffset DATETIMEOFFSET(3) = @date;

SELECT @date AS '@date',
    @datetimeoffset AS '@datetimeoffset';

Результирующий набор:

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

При преобразовании в datetime2(n)компонент даты копируется, а для компонента времени задано значение 00:00.000000. В следующем коде показаны результаты преобразования значения даты в значение datetime2(3).

DECLARE @date DATE = '1912-10-25'
DECLARE @datetime2 DATETIME2(3) = @date;

SELECT @date AS '@date',
    @datetime2 AS '@datetime2(3)';

Результирующий набор:

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

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

Преобразование строковых литералов в типы данных даты и времени разрешается, если все части строк записаны в допустимом формате. Иначе возникает ошибка времени выполнения. Неявные преобразования или явные преобразования, не указывающие стиль, от типов даты и времени до строковых литералов, находятся в формате по умолчанию текущего сеанса. В таблице ниже приводятся правила преобразования строковых литералов в тип данных 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('2022-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

Результирующий набор:

Тип данных Выходные данные
time 12:35:29.1234567
date 2022-05-08
smalldatetime 2022-05-08 12:35:00
datetime 2022-05-08 12:35:29.123
datetime2 2022-05-08 12:35:29.1234567
datetimeoffset 2022-05-08 12:35:29.1234567 +12:15

См. также