time (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

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

Свойство

Значение

Синтаксис

time [ (fractional second precision) ]

Использование

DECLARE @MyTime time(7)

CREATE TABLE Таблица1 (столбец1 time(7))

fractional seconds precision

Задает число знаков для долей секунды.

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

Точность долей секунды по умолчанию равна 7 (100 нс).

Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)

чч:мм:сс[. ннннннн]

Дополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.

Диапазон

От 00:00:00.0000000 до 23:59:59.9999999

Диапазоны элементов

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

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

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

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

Длина в символах

Минимально 8 позиций (чч:мм:сс) до 16 максимально (чч:мм:сс. ннннннн)

Точность, масштаб

(только пользовательский масштаб)

Указанный масштаб

Результат (точность, масштаб)

Длина столбца (в байтах)

Дробная часть

секунд

precision

time

(16,7)

5

7

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

Объем памяти

5 байт, по умолчанию используется фиксированная точность 100 нс.

Точность

100 наносекунд

Значение по умолчанию

00:00:00

Это значение используется для добавления компонента времени при неявном преобразовании типа данных date в тип данных datetime2 или datetimeoffset.

Определяемая пользователем точность в долях секунды

Да

Учет и сохранение смещения часового пояса

Нет

Учет перехода на летнее время

Нет

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

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

SQL Server

Описание

чч:мм[сс][:доли секунд][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 до 14, представляющее количество часов в смещении часового пояса.

  • обозначение мм состоит из двух цифр, представляющих дополнительное смещение часового пояса в минутах, и принимает значения от 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

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн] [+|-]чч:мм

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)';
--Results
--time(3)      time(4)
-------------- -------------
--12:34:54.124 12:34:54.1237
--
--(1 row(s) affected)

date

Преобразование завершается ошибкой 206: «Конфликт типов операндов: тип date несовместим с типом time».

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';
--Result
--@time         @datetime
--------------- -----------------------
--12:15:04.1237 1900-01-01 12:15:04.123
--
--(1 row(s) affected)

smalldatetime

Значения часов и минут округляются в сторону увеличения, и для даты устанавливается значение «1900-01-01». Секунды и доли секунд устанавливаются в значение 0.

Следующий код демонстрирует результаты преобразования значения time(4) в значение smalldatetime.

-- Shows rounding up of the minute value.
DECLARE @time time(4) = '12:15:59.9999'; 
DECLARE @smalldatetime smalldatetime= @time;  
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime'; 
--Result
@time            @smalldatetime
---------------- -----------------------
12:15:59.9999    1900-01-01 12:16:00--
--(1 row(s) affected)
-- Shows rounding up of the hour value.
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
(1 row(s) affected)

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';
--Result
--@time         @datetimeoffset
--------------- ------------------------------
--12:15:04.1237 1900-01-01 12:15:04.124 +00:00
--
--(1 row(s) affected)

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';
--Result
--@datetime2              @time
------------------------- -------------
--1900-01-01 12:15:04.124 12:15:04.1237
--
--(1 row(s) affected)

Преобразование строковых литералов в тип 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

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

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

Формат строковых литералов

Вставляемый строковый литерал

Хранящееся значение time(7)

Описание

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

Вставляемый строковый литерал

Тип данных столбца

Значение, хранящееся в столбце

Описание

'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)