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 |