Share via


time (Transact-SQL)

1 日の時刻を定義します。 時刻は 24 時間形式でタイム ゾーンは認識されません。

time の説明

プロパティ

構文

time [ (fractional second precision) ]

使用方法

DECLARE @MyTime time(7)

CREATE TABLE Table1 ( Column1 time(7) )

fractional seconds precision

秒の小数点以下の有効桁数を指定します。

0 ~ 7 の整数を指定できます。

既定の有効桁数は 7 (100ns) です。

既定の文字列リテラル形式

(下位のクライアントに使用)

hh:mm:ss[. nnnnnnn]

詳細については、以下の「下位クライアントの下位互換性」セクションを参照してください。

範囲

00:00:00.0000000 ~ 23:59:59.9999999

要素範囲

hh は、0 ~ 23 の時を表す 2 桁の数字です。

mm は、0 ~ 59 の分を表す 2 桁の数字です。

ss は、0 ~ 59 の秒を表す 2 桁の数字です。

n* は、秒の有効桁数を表す 0 ~ 7 桁の数字です (0 ~ 9999999)。

文字長

8 positions minimum (hh:mm:ss) to 16 maximum (hh:mm:ss. nnnnnnn)

有効桁数、小数点以下桁数

(ユーザーは小数点以下桁数のみ指定)

指定した小数点以下桁数

結果 (有効桁数、小数点以下桁数)

列長 (バイト単位)

1 秒未満の

秒の

有効桁数

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 バイト固定 (秒部分の既定の有効桁数は 100ns) です。

精度

100 ナノ秒

既定値

00:00:00

この値は、date から datetime2 または datetimeoffset への暗黙的な変換で、付加的な時刻要素として使用されます。

ユーザー定義の 1 秒未満の秒の有効桁数

あり

タイム ゾーン オフセットへの対応と保持

なし

夏時間への対応

なし

time でサポートされる文字列リテラル形式

次の表は、time データ型に使用できる有効な文字列リテラル形式を示しています。

SQL Server

説明

hh:mm[:ss][:fractional seconds][AM][PM]

hh:mm[:ss][.fractional seconds][AM][PM]

hhAM[PM]

hh AM[PM]

AM を指定したかどうかに関係なく、時刻値 0 は午前 0 時を表します。 時刻値が 0 のときに PM を指定することはできません。

AM と PM のどちらも指定していない場合、01 から 11 までの時刻値は午前の時刻を表します。 これらの値は、AM を指定した場合も午前の時刻を表します。 PM を指定すると、午後の時刻を表します。

AM と PM のどちらも指定していない場合、時刻値 12 は正午を表します。 AM を指定すると、午前 0 時を表します。 PM を指定すると、正午を表します。 たとえば、12:01 という値は、12:01 PM では正午を 1 分過ぎた時刻、12:01 AM では午前 0 時を 1 分過ぎた時刻を表します。 12:01 AM と指定しても、00:01 または 00:01 AM と指定した場合と同じ時刻を表します。

13 から 23 までの時刻値は、AM または PM を指定していなくても、午後の時刻を表します。 また、PM を指定した場合も午後の時刻を表します。 時刻値が 13 から 23 までの場合、AM を指定することはできません。

24 という時刻値は無効です。 午前 0 時を表すには、12:00 AM または 00:00 とします。

ミリ秒の前には、コロン (:) またはピリオド (.) を付けます。 コロンを付けると、後続の値は、1000 分の 1 秒単位になります。 ピリオドを付けると、数字が 1 桁なら 10 分の 1 秒単位に、2 桁なら 100 分の 1 秒単位に、3 桁なら 1000 分の 1 秒単位になります。 たとえば、"12:30:20:1" は 12 時 30 分 20 秒を 1000 分の 1 秒過ぎた時刻を表し、"12:30:20.1" は 12 時 30 分 20 秒を 10 分の 1 秒過ぎた時刻を表します。

ISO 8601

hh:mm:ss

hh:mm[:ss][.fractional seconds]

  • hh は、タイム ゾーン オフセットの時間数を表す 0 ~ 14 の 2 桁の数字です。

  • mm は、タイム ゾーン オフセットの付加的な分数を表す 0 ~ 59 の 2 桁の数字です。

ODBC

{t 'hh:mm:ss[.fractional seconds]'}

ODBC API 固有です。

SQL Server 2012 でも SQL Server 2005 と同様に機能します。

ANSI および ISO 8601 への準拠

ISO 8601 (5.3.2 および 5.3) では、午前 0 時を表す時刻値 24 や、59 を超えるうるう秒の使用が定義されていますが、こうした用法は、下位互換性および既存の日付時刻型との一貫性を保つためサポート対象外となります。

下位クライアントに使用される既定の文字列リテラル形式は、hh:mm:ss[. nnnnnnn] として定義されている SQL 標準形式に準拠しています。 この形式は、1 秒未満の秒を除き、TIME に対する ISO 8601 の定義と似ています。

下位クライアントの下位互換性

一部の下位クライアントは、time 型、date 型、datetime2 型、および datetimeoffset 型をサポートしていません。 SQL Server の上位インスタンスと下位クライアントの間のデータ型マッピングを次の表に示します。

SQL Server 2012 データ型

下位クライアントに渡される既定の文字列リテラル形式

下位 ODBC

下位 OLEDB

下位 JDBC

下位 SQLCLIENT

time

hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

date

YYYY-MM-DD

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

datetime2

YYYY-MM-DD hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

datetimeoffset

YYYY-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

日付型データと時刻型データの変換

data 型と time 型に変換する場合、SQL Server で日付や時刻と認識できない値はすべて拒否されます。 CAST 関数および CONVERT 関数で日付と時刻のデータを使用する方法については、「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

変換が失敗し、"オペランド型の不整合: date は time と互換性がありません" というエラー メッセージ 206 が表示されます。

datetime

時間、分、および秒の値がコピーされ、日付部分が '1900-01-01' に設定されます。 time(n) 値の秒の小数部の有効桁数が 3 桁を超える場合、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 日付

ODBC 文字列リテラルは、datetime データ型にマップされます。 ODBC 日付時刻リテラルから time 型への代入演算を行うと、datetime 型とこれらの型との間で、変換規則で定義されている暗黙的な変換が行われます。

ODBC 時刻

上記の ODBC 日付の規則を参照。

ODBC 日付時刻

上記の ODBC 日付の規則を参照。

日付のみ

既定値が設定される

時刻のみ

単純変換

タイム ゾーンのみ

既定値が設定される

日付 + 時刻

入力文字列の時刻部分が使用される

日付 + タイム ゾーン

使用不可

時刻 + タイム ゾーン

入力文字列の時刻部分が使用される

日付 + 時刻 + タイム ゾーン

ローカル datetime の時刻部分が使用される

使用例

A. 日付/時刻データ型を比較する

次の例では、文字列をそれぞれの 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) 値

説明

SQL Server

'01:01:01:123AM'

01:01:01.1230000

1 秒未満の秒の有効桁数の前にコロン (:) を付けた場合、小数点以下桁数が 3 桁を超えると、エラーが生成されます。

SQL Server

'01:01:01.1234567 AM'

01:01:01.1234567

AM または PM を指定した場合、時刻は 24 時間形式で格納され、リテラルの AM または PM は格納されません。

SQL Server

'01:01:01.1234567 PM'

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

1 秒未満の秒の有効桁数を指定しなかった場合、データ型で定義されている各桁が 0 になります。

ISO 8601

'01:01:01.1234567'

01:01:01.1234567

ISO 8601 に準拠するには、AM または PM を付けずに、24 時間形式を使用します。

ISO 8601

'01:01:01.1234567 +01:01'

01:01:01.1234567

TZD (Time Zone Difference) は省略可能で、入力はできますが保存されません。

C. date 型と time 型のそれぞれの列に対して時間の文字列リテラルを挿入する

次の表の 1 列目は、2 列目に示した date 型または time 型のデータベース テーブル列に挿入する時間の文字列リテラルを示しています。 3 列目は、データベース テーブル列に格納される値を示しています。

挿入する文字列リテラル

列のデータ型

列に格納される値

説明

'12:12:12.1234567'

time(7)

12:12:12.1234567

1 秒未満の秒の有効桁数が、列に指定された値を超えた場合、エラーは生成せずに文字列が切り詰められます。

'2007-05-07'

date

NULL

time 値により、INSERT ステートメントが失敗します。

'12:12:12'

smalldatetime

1900-01-01 12:12:00

1 秒未満の秒の有効桁数の値によって、INSERT ステートメントが失敗します。

'12:12:12.123'

datetime

1900-01-01 12:12:12.123

秒の有効桁数が 3 桁を超えると、INSERT ステートメントが失敗します。

'12:12:12.1234567'

datetime2(7)

1900-01-01 12:12:12.1234567

1 秒未満の秒の有効桁数が、列に指定された値を超えた場合、エラーは生成せずに文字列が切り詰められます。

'12:12:12.1234567'

datetimeoffset(7)

1900-01-01 12:12:12.1234567 +00:00

1 秒未満の秒の有効桁数が、列に指定された値を超えた場合、エラーは生成せずに文字列が切り詰められます。

関連項目

参照

CAST および CONVERT (Transact-SQL)