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


time (Transact-SQL)

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

Определяет время дня. Время без учета часового пояса в 24-часовом формате.

Примечание.

Сведения об Informatica предоставляются для клиентов PDW, использующих соединитель Informatica.

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

Свойство Значение
Синтаксис time [ (fractional second scale) ]
Использование DECLARE @MyTime time(7)

CREATE TABLE Таблица1 ( Столбец1 time(7) )
fractional seconds scale Задает число знаков для долей секунды.

Может быть целым числом от 0 до 7. Для Informatica может быть целым числом от 0 до 3.

Длина дробной части по умолчанию равна 7 (100 нс).

В Microsoft Fabric это может быть целое число от 0 до 6 без значения по умолчанию. Точность должна быть указана в Microsoft Fabric.
Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)
чч:мм:сс[.ннннннн] для Informatica)

Дополнительные сведения см. в разделе Обратная совместимость для клиентов нижнего уровня.
Диапазон От 00:00:00.0000000 до 23:59:59.9999999 (от 00:00:00.000 до 23:59:59.999 для Informatica)
Диапазоны элементов Обозначение чч состоит из двух цифр, представляющих час, и принимает значения от 0 до 23.

Обозначение мм состоит из двух цифр, представляющих минуты, и принимает значения от 0 до 59.

Обозначение сс состоит из двух цифр, представляющих секунды, и принимает значения от 0 до 59.

Обозначение n* может содержать от нуля до семи цифр, представляющих доли секунды, и принимает значения от 0 до 9999999. Для Informatica обозначение n* может содержать от нуля до трех цифр и принимает значения от 0 до 999.
Длина в символах От 8 позиций (чч:мм:сс) до 16 позиций (чч:мм:сс.ннннннн). Для Informatica максимальная длина равна 12 (чч:мм:сс.ннн).
Точность, масштаб

(только пользовательский масштаб)
См. таблицу ниже.
Объем памяти 5 байт, по умолчанию используется фиксированная точность 100 нс. В Informatica размер по умолчанию — 4 байта; по умолчанию используется фиксированная точность 1 мс.
Правильность 100 наносекунд (1 миллисекунда в Informatica)
Default value 00:00:00

Это значение используется как присоединяемая часть даты при неявном преобразовании данных типа date в значение типа datetime2 или datetimeoffset.
Определяемая пользователем точность в долях секунды Да
Учет и сохранение смещения часового пояса No
Учет перехода на летнее время No
Указанный масштаб Результат (точность, масштаб) Длина столбца (в байтах) Дробная часть

с

точность
time (16,7) [(12,3) в Informatica] 5 (4 в Informatica) 7 (3 в Informatica)
time(0) (8,0) 3 0–2
time(1) (10,1) 3 0–2
time(2) (11,2) 3 0–2
time(3) (12,3) 4 3–4
time(4)* (13,4) 4 3–4
time(5)* (14,5) 5 5–7
time(6)* (15,6) 5 5–7
time(7)* + (16,7) 5 5–7

* Не поддерживается в Informatica.

+ Не поддерживается в Microsoft Fabric.

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

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

SQL Server Description
чч:мм[сс][:доли секунд][AM][PM]

чч:мм[сс][.доли секунд][AM][PM]

ччAM[PM]

чч AM[PM]
Значение часа 0 означает час после полуночи (AM), независимо от указания литерала «AM». Если час равен 0, «PM» указывать нельзя.

Значения часа от 01 до 11 представляют часы до полудня, если не задан параметр AM или PM. Если задан параметр «AM», то эти значения так же представляют часы до полудня. Если указано «PM», то эти значения указывают на часы после полудня.

Значение 12 представляет час, начавшийся в полдень, если не указано «PM» или «AM». Если указано «AM», это значение представляет час, начавшийся в полночь. Если указано «PM», то это значение представляет час, начавшийся в полдень. Например, 12:01 — это 1 минута после полудня, так же как и 12:01 PM, тогда как 12:01 AM — это 1 минута после полуночи. 12:01 АМ аналогично указанию 00:01 или 00:01 AM.

Значения часов от 13 до 23 представляют часы после полудня, если не указано «AM» или «PM». Если задан параметр «PM», то эти значения также представляют часы после полудня. Если час принимает значение от 13 до 23, то указывать «AM» нельзя.

Значение часа, равное 24, недопустимо. Для представления полночи используется 12:00 AM или 00:00.

Миллисекундам может предшествовать либо двоеточие (:), либо точка (.). Число после двоеточия обозначает тысячные доли секунды. При использовании точки однозначное число обозначает десятые доли секунды, двузначное число — сотые, а трехзначное — тысячные доли секунды. Например: 12:30:20:1 означает 20 секунд и одну тысячную долю секунды после 12:30, 12:30:20.1 означает 20 секунд и одну десятую секунды после 12:30.
ISO 8601 Примечания.
чч:мм:сс

чч:мм[:сс][.доли секунды]
чч — двузначное число от 0 до 23, представляющее количество часов в смещении часового пояса.

обозначение мм состоит из двух цифр, представляющих дополнительное смещение часового пояса в минутах, и принимает значения от 0 до 59;
ODBC Примечания.
{ t 'чч-мм-сс[.доли секунды]'} Зависит от API-интерфейса ODBC.

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

Использование 24-часового формата и секунды координации свыше 59 согласно стандарту ISO 8601 (5.3.2 и 5.3) не поддерживается с целью обратной совместимости и соответствия существующим форматам даты и времени.

Формат строковых литералов по умолчанию (который используется для клиента нижнего уровня) соответствует стандарту языка SQL, определенному в форме чч.мм:сс[.ннннннн]. Такой формат напоминает определение стандарта ISO 8601 для типа TIME, за исключением долей секунд.

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

Некоторые клиенты нижнего уровня не поддерживают типы данных 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 ГГГГ-ММ-ДД чч:мм:сс[.nnnnn] [+|-]hh:mm SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString

Преобразование данных типа Date и Time

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

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

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

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

DECLARE @timeFrom TIME(4) = '12:34:54.1237';
DECLARE @timeTo TIME(3) = @timeFrom;

SELECT @timeTo AS 'time(3)', @timeFrom AS 'time(4)';

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

time(3)      time(4)  
------------ -------------  
12:34:54.124 12:34:54.1237  

Если преобразование равно дате, преобразование завершается ошибкой, и возникает сообщение об ошибке 206: "Столкновение типов Операнда: дата несовместима с временем".

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

DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetime DATETIME = @time;

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

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

@time         @datetime  
------------- -----------------------  
12:15:04.1237 1900-01-01 12:15:04.123  

При преобразовании в тип smalldatetime значения часов и минут округляются в сторону увеличения, и для даты устанавливается значение "1900-01-01". Секунды и доли секунд устанавливаются в значение 0. Следующий код демонстрирует результаты преобразования значения time(4) в значение smalldatetime.

Отображение округления значения минуты:

DECLARE @time TIME(4) = '12:15:59.9999';
DECLARE @smalldatetime SMALLDATETIME = @time;

SELECT @time AS '@time', @smalldatetime AS '@smalldatetime';

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

@time            @smalldatetime  
---------------- -----------------------  
12:15:59.9999    1900-01-01 12:16:00--  

Отображение округления значения часа:

DECLARE @time TIME(4) = '12:59:59.9999';
DECLARE @smalldatetime SMALLDATETIME = @time;

SELECT @time AS '@time', @smalldatetime AS '@smalldatetime';

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

@time            @smalldatetime  
---------------- -----------------------  
12:59:59.9999    1900-01-01 13:00:00  

При преобразовании в datetimeoffset(n) время копируется, а для даты устанавливается значение "1900-01-01". Для смещения часового пояса устанавливается значение +00:00. Если точность в долях секунды значения типа time(n) больше, чем точность значения типа datetimeoffset(n), значение округляется в сторону увеличения. В следующем примере демонстрируются результаты преобразования значения типа time(4) в тип datetimeoffset(3).

DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetimeoffset DATETIMEOFFSET(3) = @time;

SELECT @time AS '@time', @datetimeoffset AS '@datetimeoffset';

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

@time         @datetimeoffset  
------------- ------------------------------  
12:15:04.1237 1900-01-01 12:15:04.124 +00:00  

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

DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetime2 DATETIME2(3) = @time;

SELECT @datetime2 AS '@datetime2', @time AS '@time';

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

@datetime2              @time  
----------------------- -------------  
1900-01-01 12:15:04.124 12:15:04.1237  

Преобразование строковых литералов в тип time(n)

Преобразование строковых литералов в типы данных даты и времени разрешается, если все части строк записаны в допустимом формате. Иначе возникает ошибка времени выполнения. Явные или скрытые преобразования, в которых не задан стиль преобразования типов данных даты и времени в строковые литералы, будут проведены в формате по умолчанию для текущего сеанса. В таблице ниже приводятся правила преобразования строковых литералов в тип данных time.

Строковый литерал входа Правило преобразования
ODBC DATE Строковые литералы ODBC сопоставляются с типом данных datetime. Любая операция присваивания литералов ODBC DATETIME типу данных time вызывает неявное преобразование между данным типом и типом datetime согласно правилам преобразования.
ODBC TIME См. правило ODBC DATE выше.
ODBC DATETIME См. правило ODBC DATE выше.
только DATE Указаны значения по умолчанию.
только TIME Простейший.
только TIMEZONE Указаны значения по умолчанию.
DATE + TIME Используется компонент TIME входной строки.
DATE + TIMEZONE Запрещено.
TIME + TIMEZONE Используется компонент TIME входной строки.
DATE + TIME + TIMEZONE Используется компонент TIME локального значения 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

B. Вставка допустимых строковых литералов времени в столбец time(7)

В таблице ниже приводится список строковых литералов, которые можно вставлять в столбец с типом данных time(7) вместе со значениями, хранящимися в этом столбце.

Формат строковых литералов Вставляемый строковый литерал Хранящееся значение time(7) Description
SQL Server '01:01:01:123AM' 01:01:01.1230000 Если перед долями секунд стоит двоеточие (:), масштаб не может превышать трех позиций, иначе возникает ошибка.
SQL Server '01:01:01.1234567 AM' 01:01:01.1234567 Если указан параметр «AM» или «PM», время сохраняется в 24-часовом формате без литерала «AM» или «PM».
SQL Server '01:01:01.1234567 AM' 13:01:01.1234567 Если указан параметр «AM» или «PM», время сохраняется в 24-часовом формате без литерала «AM» или «PM».
SQL Server '01:01:01.1234567PM' 13:01:01.1234567 Пробел перед литералом «AM» или «PM» является необязательным.
SQL Server '01AM' 01:00:00.0000000 Если задан только час, все остальные значения равны 0.
SQL Server '01 AM' 01:00:00.0000000 Пробел перед литералом «AM» или «PM» является необязательным.
SQL Server '01:01:01' 01:01:01.0000000 Если не заданы доли секунды, каждая позиция, определяемая этим типом данных, равна 0.
ISO 8601 '01:01:01.1234567' 01:01:01.1234567 Для соответствия стандарту ISO 8601 используется 24-часовой формат, а не литералы «AM» и «PM».
ISO 8601 '01:01:01.1234567 +01:01' 01:01:01.1234567 Необязательная разница во времени (TZD) во входных данных разрешается, но не сохраняется.

В. Вставка строкового литерала времени в столбцы каждого типа данных date и time

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

Вставляемый строковый литерал Тип данных столбца Значение, хранящееся в столбце Description
'12:12:12.1234567' time(7) 12:12:12.1234567 Если точность в долях секунды превышает значение, указанное для столбца, строка будет усечена без сообщения об ошибке.
'2007-05-07' date NULL Любое значение времени вызовет ошибку инструкции INSERT.
'12:12:12' smalldatetime 1900-01-01 12:12:00 Любое значение долей секунды вызовет ошибку инструкции INSERT.
'12:12:12.123' datetime 1900-01-01 12:12:12.123 Любое значение долей секунды длиннее трех позиций вызовет ошибку инструкции INSERT.
'12:12:12.1234567' datetime2(7) 1900-01-01 12:12:12.1234567 Если точность в долях секунды превышает значение, указанное для столбца, строка будет усечена без сообщения об ошибке.
'12:12:12.1234567' datetimeoffset(7) 1900-01-01 12:12:12.1234567 +00:00 Если точность в долях секунды превышает значение, указанное для столбца, строка будет усечена без сообщения об ошибке.

См. также

CAST и CONVERT (Transact-SQL)