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 | Если точность в долях секунды превышает значение, указанное для столбца, строка будет усечена без сообщения об ошибке. |