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


datetime (Transact-SQL)

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Определяет дату, включающую время дня с долями секунды в 24-часовом формате.

Избегайте использования даты и времени для новой работы. Вместо этого используйте типы данных date, date, datetime2 и datetimeoffset . Эти типы соответствуют стандарту SQL и более переносимы. Типы time, datetime2 и datetimeoffset обеспечивают большую точность секунд. datetimeoffset обеспечивает поддержку часовых поясов для приложений, развертываемых по всему миру.

Description

Свойство Значение
Синтаксис DATETIME
Использование DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
Форматы строковых литералов по умолчанию (используются для клиента нижнего уровня) Нет данных
Диапазон даты 1753-01-01 (1 января 1753 г.) до 9999-12-31 (31 декабря 9999 г.)
Диапазон времени От 00:00:00 до 23:59:590,997
Диапазон смещения часового пояса нет
Диапазоны элементов yyyy — четыре цифры от 1753 9999 этого года.

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

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

HH — это две цифры, начиная от 00 23от , которые представляют час.

mm — это две цифры, начиная от 00 59от , которые представляют минуту.

ss — это две цифры, начиная от 00 59от , которые представляют второй.

n* равно нулю до трех цифр, начиная от 0 999от , которые представляют дробные секунды.
Длина символа Минимально 19 позиций, максимально — 23
Размер хранилища 8 байт
Точность Округлено до добавок .000, .003или .007 секунд
Значение по умолчанию 1900-01-01 00:00:00
Календарь Григориан (включает полный диапазон лет)
Определяемая пользователем дробная вторая точность No
Смещение часового пояса с учетом и сохранением No
С учетом дневного света No

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

В представленных ниже таблицах приводятся поддерживаемые форматы строковых литералов для типа данных datetime. За исключением ODBC, строковые литералы datetime находятся в отдельных кавычках ('например, 'string_literaL'). Если среда не us_englishявляется, строковые литералы должны быть в формате N'string_literaL'Юникода.

Числовой формат

Месяц в датах может указываться в числовом формате. Например, 5/20/97 представляет двадцатый день мая 1997 года. При использовании формата числовых дат укажите месяц, день и год в строке, которая использует знаки косой черты (), дефисы (/-) или точки (.) в качестве разделителей. Эта строчка должна выглядеть следующим образом:

<number separator number separator number [time] [time]>

Если для языка задано us_englishзначение, по умолчанию для даты задано mdy значение (месяц, день, год). Порядок даты можно изменить с помощью инструкции SET DATEFORMAT.

Параметр для SET DATEFORMAT определения интерпретации значений даты. Если порядок не соответствует конфигурации, значения не обрабатываются как даты. Даты вне порядка могут быть неправильно интерпретированы как не в диапазоне или с неправильными значениями. Например, 12/10/08 можно интерпретировать как одну из шести дат в зависимости от DATEFORMAT параметра. Четырехзначный год интерпретируется как год.

Формат даты Порядок
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
Формат времени:
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

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

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

Некоторые рекомендации по применению алфавитных форматов даты:

  • Заключите данные даты и времени в одинарные кавычки ('). Для языков, отличных от английского, используйте N''.

  • Символы, заключенные в квадратные скобки, являются необязательными.

  • Если указать только последние две цифры года, значения меньше, чем последние две цифры значения параметра конфигурации отсечения двухзначного года, находятся в том же веке, что и отсеченный год. Значения, большие или равные двум последним цифрам этого параметра, относятся к столетию, предшествующему столетию года усечения. Например, если отсечение двухзначного года равно 2050 (по умолчанию), 25 интерпретируется как 2025 и 50 интерпретируется как 1950. Во избежание неоднозначности используйте четырехзначную запись года.

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

  • Параметр SET DATEFORMAT сеанса не применяется при указании месяца в алфавитном формате.

В алфавитном порядке
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

(в формате ISO 8601).

Чтобы использовать формат ISO 8601, необходимо указать каждый элемент в формате, включая Tдвоеточие (:) и период (.), отображаемый в формате.

Квадратные скобки показывают, что доли секунд не являются обязательными. Временной компонент указан в 24-часовом формате. Указывает T начало периода времени значения даты и времени .

Преимущество использования формата ISO 8601 заключается в том, что это международный стандарт с однозначной спецификацией. Кроме того, этот формат не влияет на SET DATEFORMAT параметр или SET LANGUAGE .

Примеры:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Формат unseparated

Этот формат аналогичен формату ISO 8601, за исключением того, что он не содержит разделителей дат.

Без разделителей
yyyyMMdd HH:mm:ss[.mmm]

Формат ODBC

Интерфейс API ODBC определяет управляющие последовательности, представляющие значения даты и времени, называемые в ODBC метками времени. Этот формат метки времени ODBC также поддерживается определением языка OLE DB (DBGUID-SQL), поддерживаемым поставщиком Microsoft OLE DB для SQL Server. Приложения, использующие ADO, OLE DB или API-интерфейсы, основанные на ODBC, могут использовать этот формат отметок времени ODBC для представления даты и времени.

Escape-последовательности меток времени ODBC имеют формат: { <literal_type> '<constant_value>' }

  • <literal_type> указывает тип escape-последовательности. Метки времени имеют три <literal_type> описателя:

    • d = только дата
    • t = только время
    • ts = метка времени (время и дата)
  • <constant_value> — значение escape-последовательности. <constant_value> должны соответствовать этим форматам для каждого <literal_type>:

    • d: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

Округление типа данных datetime до долей секунды

Значения datetime округляются до добавок .000, .003или .007 секунд, как показано в следующем примере.

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

Вот результирующий набор.

Указанное пользователем значение Значение, хранимое системой
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

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

datetime не удовлетворяет стандартам ANSI и ISO 8601.

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

При преобразовании в типы данных даты и времени ядро СУБД отклоняет все значения, которые не могут распознаваться как даты или время. Сведения об использовании и CONVERT функциях с данными CAST даты и времени см. в разделе CAST и CONVERT.

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

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

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

DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;

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

Вот результирующий набор.

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

В предыдущем примере используется формат определенной даты региона (MM-DD-YY).

DECLARE @date DATE = '12-21-16';

Вы должны обновить пример, чтобы он соответствовал формату вашего региона.

Вы также можете выполнить пример с форматом даты соответствия ISO 8601 (yyyy-MM-dd). Например:

DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;

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

При преобразовании из времени (n)компонент времени копируется, а для компонента даты задано значение 1900-01-01. Если дробная точность значения time(n) больше трех цифр, значение усечено для соответствия. Следующий пример показывает результаты преобразования значения TIME(4) в значение DATETIME.

DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;

SELECT @datetime AS '@datetime', @time AS '@time';

Вот результирующий набор.

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

При преобразовании из типа smalldatetime копируются часы и минуты. Для секунд и дробных секунд задано значение 0. Следующий код демонстрирует результаты преобразования значения SMALLDATETIME в значение DATETIME.

DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;

SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';

Вот результирующий набор.

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

При преобразовании из datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Если дробная точность значения datetimeoffset(n) больше трех цифр, значение усечено. Следующий пример показывает результаты преобразования значения DATETIMEOFFSET(4) в значение DATETIME.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';

Вот результирующий набор.

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

При преобразовании из datetime2(n) копируются дата и время. Если дробная точность значения datetime2(n) больше трех цифр, значение усечено. Следующий пример показывает результаты преобразования значения DATETIME2(4) в значение DATETIME.

DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;

SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';

Вот результирующий набор.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

Примеры

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

SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

Вот результирующий набор.

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