Share via


datetime2 (Transact-SQL)

24 時間形式の時刻と組み合わせた日付を定義します。 datetime2 は、既存の datetime 型を拡張して、日付範囲と既定の有効桁数を増やし、ユーザーが必要に応じて有効桁数を指定できるようにしたものと考えることができます。

datetime2 の説明

プロパティ

構文

datetime2 [ (fractional seconds precision) ]

使用方法

DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )

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

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

YYYY-MM-DD hh:mm:ss[.fractional seconds]

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

日付範囲

0001-01-01 ~ 9999-12-31

西暦 1 年 1 月 1 日~西暦 9999 年 12 月 31 日

時刻範囲

00:00:00 ~ 23:59:59.9999999

タイム ゾーン オフセット範囲

なし

要素範囲

YYYY は、年を表す 0001 ~ 9999 の 4 桁の数字です。

MM は、指定された年の 01 ~ 12 の月を表す 2 桁の数字です。

DD は、指定された月の (月に応じて) 01 ~ 31 の日を表す 2 桁の数字です。

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

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

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

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

文字長

19 文字 (YYYY-MM-DD hh:mm:ss ) 以上、27 文字 (YYYY-MM-DD hh:mm:ss.0000000) 以下

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

0 ~ 7 桁で、精度は 100ns です。 既定の有効桁数は 7 桁です。

ストレージのサイズ

有効桁数が 3 未満の場合は 6 バイト、有効桁数が 3 および 4 の場合は 7 バイトです。 その他のすべての有効桁数には 8 バイトが必要です。

精度

100 ナノ秒

既定値

1900-01-01 00:00:00

カレンダー

グレゴリオ暦

ユーザー定義の、秒の小数部の有効桁数

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

不可

夏時間への対応

不可

データ型のメタデータについては、「sys.systypes (Transact-SQL)」または「TYPEPROPERTY (Transact-SQL)」を参照してください。 一部の日付時刻データ型では、有効桁数および小数点以下桁数が可変です。 特定の列の有効桁数および小数点以下桁数を取得する方法については、「COLUMNPROPERTY (Transact-SQL)」、「COL_LENGTH (Transact-SQL)」、または「sys.columns (Transact-SQL)」を参照してください。

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

次の表は、datetime2 でサポートされている ISO 8601 および ODBC の文字列リテラル形式を一覧にしたものです。 datetime2 の日付部分と時刻部分に使用できるアルファベット、数値、区切りなし、時刻の各形式については、「date (Transact-SQL)」および「time (Transact-SQL)」を参照してください。

ISO 8601

説明

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

この形式は、セッションのロケール設定である SET LANGUAGE および SET DATEFORMAT の影響を受けません。 文字列リテラルには、T、コロン (:)、およびピリオド (.) が含まれます (例 : '2007-05-02T19:58:47.1234567')。

ODBC

説明

{ ts 'yyyy-mm-dd hh:mm:ss[.fractional seconds]' }

ODBC API 固有です。

  • 1 秒未満の秒を表す小数点の右側の桁数は、0 ~ 7 (100 ナノ秒) の範囲で指定できます。

  • SQL Server 2012 では、互換性レベルを 10 に設定した場合、リテラルが内部的に新しい time 型にマップされます。

ANSI および ISO 8601 への準拠

datetime2 の ANSI および ISO 8601 への準拠は、date 型および time 型と同じです。

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

一部の下位クライアントは、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)」を参照してください。

datetime2 データ型から他の日付/時刻データ型への変換

次の表では、datetime2 データ型が他の日付/時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

date

年、月、日がコピーされます。

次のコードは、datetime2(4) 値を date 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

秒の小数部の桁数が同じ場合、時間、分、秒、および秒の小数部がコピーされ、秒の小数部の桁数が異なる場合、切り上げられます。

次のコードは、datetime2(4) 値を time(3) 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

日付と時刻の値がコピーされます。 datetime(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。

次のコードは、datetime2 値を datetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

日付および時間がコピーされます。 秒を基準として分が切り上げられ、秒は 0 に設定されます。

次のコードは、datetime2 値を smalldatetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

datetime2(n) 値が datetimeoffset(n) 値にコピーされます。 タイム ゾーン オフセットが +00:0 に設定されます。 datetime2(n) 値の有効桁数が datetimeoffset(n) 値の有効桁数を超える場合、値はその桁数に合わせて切り上げられます。

次のコードは、datetime2(5) 値を datetimeoffset(3) 値に変換した結果を示しています。

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(1 row(s) affected)

文字列リテラルから datetime2 への変換

文字列リテラルから日付/時刻データ型への変換は、文字列のすべての部分が有効な形式になっている場合に可能になります。 それ以外の場合は実行時エラーが発生します。 日付/時刻データ型から文字列リテラルへの暗黙的な変換や、スタイルを指定しない明示的な変換では、現在のセッションの既定の形式が使用されます。 次の表に、文字列リテラルを datetime2 データ型に変換する規則を示します。

入力文字列リテラル

datetime2(n)

ODBC 日付

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

ODBC 時刻

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

ODBC 日付時刻

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

日付のみ

時刻部分は既定値の 00:00:00 に設定される

時刻のみ

日付部分は既定値の 1900-1-1 に設定される

タイム ゾーンのみ

既定値が設定される

日付 + 時刻

単純変換

日付 + タイム ゾーン

使用不可

時刻 + タイム ゾーン

日付部分は既定値の 1900-1-1 に設定される。 タイム ゾーンの入力は無視される。

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

ローカル 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

関連項目

参照

CAST および CONVERT (Transact-SQL)