date (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в 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 диапазон 1582 9999 .MM — это две цифры от 01 12 того, что представляет месяц в указанном году.dd — две цифры от 01 31 месяца в зависимости от месяца, представляющего день указанного месяца. |
Длина в символах | 10 позиций |
Точность, масштаб | 10, 0 |
Объем памяти | 3 байта, фиксированный |
Структура хранилища | одна 3-байтовая целочисленная дата хранения |
Правильность | Один день |
Default value | 1900-01-01 Это значение используется как присоединяемая часть даты при неявном преобразовании данных типа time в значение типа datetime2 или datetimeoffset. |
Календарь | Григорианский |
Определяемая пользователем точность в долях секунды | No |
Учет и сохранение смещения часового пояса | No |
Учет перехода на летнее время | No |
Поддерживаемые форматы строковых литералов для типа данных date
В следующих списках показаны допустимые форматы строковых литералов для типа данных даты .
[m]m
, dd
и [yy]yy
представляет месяц, день и год в строке со знаками косой черты (), дефисами (/
-
) или периодами (.
) в качестве разделителей.
Поддерживаются только четыре цифры или двухзначные годы. Для записи года рекомендуется всегда использовать четырехзначный формат. Чтобы указать целое число от 0001
9999
того, что представляет собой отрезок года для интерпретации двухзначных лет в виде четырехзначных лет, используйте параметр конфигурации сервера отсечения двухзначного года.
Для Informatica yyyy
ограничен диапазоном 1582
9999
.
Если двузначное число, обозначающее год, меньше или равно двузначному числу из последних двух цифр порогового года, год относится к тому же столетию, что и пороговый год. Если двузначное число, обозначающее год, больше двузначного числа из последних двух цифр порогового года, год относится к столетию, которое предшествует столетию порогового года. Например, если двухзначный отрезок года является стандартным 2049
, двухзначный год 49
интерпретируется как 2049
и двухзначный год 50
интерпретируется как 1950
.
Текущий языковой параметр определяет формат даты по умолчанию. Формат даты можно изменить с помощью инструкций SET LANGUAGE и SET DATEFORMAT.
Формат ydm
не поддерживается для даты.
Форматы строковых литералов для месячного года
SET DATEFORMAT mdy;
[m]m/dd/[yy]yy
[m]m-dd-[yy]yy
Форматы строковых литералов для месячного дня
SET DATEFORMAT myd;
[m]m/[yy]yy/dd
[m]m-[yy]yy-dd
[m]m.[yy]yy.dd
Форматы строковых литералов для дневного месяца
SET DATEFORMAT dmy;
dd/[m]m/[yy]yy
dd-[m]m-[yy]yy
dd.[m]m.[yy]yy
Форматы строковых литералов для дневного месяца
SET DATEFORMAT dym;
dd/[yy]yy/[m]m
dd-[yy]yy-[m]m
dd.[yy]yy.[m]m
Форматы строковых литералов для дня года
SET DATEFORMAT ymd;
[yy]yy/[m]m/dd
[yy]yy-[m]m-dd
[yy]yy-[m]m-dd
Алфавитный список форматов
[dd] mon[,] yyyy
dd mon[,][yy]yy
dd [yy]yy mon
[dd] yyyy mon
mon [dd][,] yyyy
mon dd[,] [yy]
mon yyyy [dd]
yyyy mon [dd]
yyyy [dd] mon
mon
представляет полное имя месяца или сокращенное значение месяца, заданное на текущем языке. Запятые являются необязательными, регистр букв не учитывается.
Во избежание неоднозначности используйте четырехзначную запись года.
Если не указано число месяца, подразумевается первое число месяца.
Список форматов ISO 8601
yyyy-MM-dd
yyyyMMdd
То же, что и стандарт SQL. Этот формат является единственным международным стандартом.
Неуправляемый список форматов
[yy]yyMMdd
yyyy[MMdd]
Данные типа date могут быть определены с помощью четырех, шести или восьми цифр. Шестизначная или восьмизначная строка всегда интерпретируется как ymd
. На месяц и день всегда должно приходиться по две цифры. Четырехзначная строка интерпретируется как год.
Формат даты ODBC
{ d 'yyyy-MM-dd' }
Зависит от API-интерфейса ODBC.
Формат даты W3C XML
yyyy-MM-ddTZD
Введен для использования в XML и SOAP.
TZD
— это конструктор часового пояса (Z
или-hh:mm
+hh:mm
):
hh:mm
представляет смещение часового пояса.hh
— две цифры, начиная от0
14
от , которые представляют количество часов в смещение часового пояса.mm
— это две цифры, начиная от0
59
от , которые представляют количество дополнительных минут в смещение часового пояса.+
(плюс) или-
(минус) является обязательным признаком смещения часового пояса. Данный знак указывает, добавляется или вычитается смещение часового пояса от времени в формате UTC, чтобы получить локальное время. Допустимый диапазон смещения часового пояса — от-14:00
.+14:00
Соответствие стандартам ANSI и ISO 8601
Значение date соответствует стандартному определению ANSI SQL для григорианского календаря:
Типы данных 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.
Преобразование даты в другие типы дат и времени
В этом разделе описывается, что происходит при преобразовании типа данных date в другие типы даты и времени.
При преобразовании в time(n)преобразование завершается ошибкой и возникает сообщение об ошибке 206:
Столкновение типов операнда: дата несовместима с временем.
Если преобразование равно datetime, компонент даты копируется. В следующем коде показаны результаты преобразования значения даты в значение datetime .
DECLARE @date AS DATE = '12-10-25';
DECLARE @datetime AS 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 AS DATE = '1912-10-25';
DECLARE @smalldatetime AS 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 AS DATE = '1912-10-25';
DECLARE @datetimeoffset AS 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 AS DATE = '1912-10-25';
DECLARE @datetime2 AS 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 |