次の方法で共有


datetime2 (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database

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

datetime2 の説明

プロパティ
構文 datetime2 [ (fractional seconds precision) ]
使用方法 DECLARE @MyDatetime2 datetime2(7);
CREATE TABLE Table1 (Column1 datetime2(7));
既定の文字列リテラル形式

(下位クライアントに使用)
yyyy-MM-dd HH:mm:ss[.nnnnnnn]

詳細については、この記事の後半の「 下位クライアントのバックワード互換性 を参照してください。
日付範囲 0001-01-01 から 9999-12-31

1 月 1 日 1 CE ~12 月 31 日 9999 CE
時間の範囲 00:00:00 から 23:59:59.9999999
タイム ゾーンのオフセット範囲 なし
要素範囲 yyyy は 4 桁の数字で、 0001 から 9999 までの範囲で、1 年を表します。

MM は、 01 から 12までの 2 桁の数字で、指定した年の月を表します。

dd は、指定した月の日を表す月に応じて、 01 から 31 までの 2 桁の数値です。

HH は 2 桁の数字で、 00 から 23 までの範囲で、時間を表します。

mm は 2 桁の数字で、 00 から 59 までの範囲で、分を表します。

ss は 2 桁の数字で、 00 から 59 までの範囲で、2 番目の数値を表します。

n* は、秒の小数部を表す、 0 から 9999999 までの 0 から 7 桁の数値です。 Informatica では、 n3未満の場合、秒の小数部が切り捨てられます。
文字長 最小 19 位置 (yyyy-MM-dd HH:mm:ss) から最大 27 (yyyy-MM-dd HH:mm:ss.0000000)
有効桁数、小数点以下桁数 0 ~ 7 桁、精度は 100 ナノ秒 (100 ns)。 既定の有効桁数は 7 桁です。

Microsoft Fabric Data Warehouse では、この有効桁数は 0 から 6 の整数にすることができ、既定値はありません。 精度は、Microsoft Fabric Data Warehouse で指定する必要があります。
ストレージ サイズ 1 有効桁数が 3 より小さい場合は 6 バイトです。
有効桁数が 3 または 4 の場合は 7 バイトです。

他のすべての有効桁数には 8 バイトが必要です。 2
精度 100 ナノ秒
規定値 1900-01-01 00:00:00
Calendar グレゴリオ暦
ユーザー定義の 1 秒未満の秒の有効桁数 はい
タイム ゾーン オフセットへの対応と保持 いいえ
夏時間への対応 いいえ

1 指定された値は、非圧縮行ストア用です。 data 圧縮または columnstore を使用すると、有効桁数ごとにストレージ サイズが変更される場合があります。 さらに、ディスク上とメモリ内のストレージ サイズが異なる場合があります。 たとえば、バッチ モードを使用する場合、datetime2 値は常にメモリ内の 8 バイトを必要とします。

2 datetime2 値が varbinary 値にキャストされると、有効桁数を格納するために追加のバイトが varbinary 値に追加されます。

データ型のメタデータについては、 sys.systypes または TYPEPROPERTY を参照してください。 一部の日付時刻データ型では、有効桁数および小数点以下桁数が可変です。 列の有効桁数と小数点以下桁数を取得するには、 COLUMNPROPERTYCOL_LENGTH、または sys.columns を参照してください。

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

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

ISO 8601 説明
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] この形式は、 SET LANGUAGE および SET DATEFORMAT セッションロケール設定の影響を受けません。 文字列リテラルには、 T、コロン (:)、ピリオド (.) が含 2024-05-02T19:58:47.1234567などです。
ODBC 説明
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } ODBC API 固有:

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

ANSI および ISO 8601 への準拠

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

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

一部の下位レベル クライアントは、timedatedatetime2datetimeoffset データ型をサポートしていません。 SQL Server の上位インスタンスと下位クライアントの間のデータ型マッピングを次の表に示します。

SQL Server のデータ型 下位クライアントに渡される既定の文字列リテラル形式 下位 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[.nnnnnnnnn] 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

日付と時刻のデータを変換する

日付と時刻のデータ型に変換すると、データベース エンジンは日付または時刻として認識できないすべての値を拒否します。 日付と時刻のデータで CAST および CONVERT 関数を使用する方法については、 CAST および CONVERT を参照してください。

その他の日付と時刻の型を datetime2 データ型に変換する

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

date からの変換では、年、月、日がコピーされます。 時刻部分は 00:00:00.0000000 に設定されます。 次のコードは、date 値を datetime2 値に変換した結果を示しています。

DECLARE @date AS DATE = '12-21-16';

DECLARE @datetime2 AS DATETIME2 = @date;

SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

結果セットは次のとおりです。

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

変換が time(n) から行われる場合、時刻コンポーネントがコピーされ、日付コンポーネントが 1900-01-01に設定されます。 次の例は、 time(7) 値を datetime2 値に変換した結果を示しています。

DECLARE @time AS TIME (7) = '12:10:16.1234567';

DECLARE @datetime2 AS DATETIME2 = @time;

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

結果セットは次のとおりです。

@datetime2                  @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567

smalldatetime からの変換では、時と分がコピーされます。 秒と秒の小数部は 0 に設定されます。 次のコードは、smalldatetime 値を datetime2 値に変換した結果を示しています。

DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

結果セットは次のとおりです。

@datetime2                  @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00

datetimeoffset(n) からの変換では、日付と時刻の部分がコピーされます。 タイム ゾーンは切り捨てられます。 次の例は、datetimeoffset(7) 値を datetime2 値に変換した結果を示しています。

DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';

DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2',
       @datetimeoffset AS '@datetimeoffset';

結果セットは次のとおりです。

@datetime2                  @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

datetime からの変換では、日付と時刻がコピーされます。 小数部の有効桁数は 7 桁まで拡張されます。 次の例は、datetime 値を datetime2 値に変換した結果を示しています。

DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';

DECLARE @datetime2 AS DATETIME2 = @datetime;

SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

結果セットは次のとおりです。

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

datetime を使用する場合に明示的に datetime2 にキャストする

データベース互換性レベル 130 以上では、 datetime から datetime2 への暗黙的な変換では データ型はミリ秒の小数部を計算することで精度が向上し、前の例のように異なる変換値が生成されます。 datetimedatetime2 データ型の間に混合比較シナリオが存在する場合は常に、明示的なキャストを使用してデータ型します。 詳細については、「一部のデータ型と一般的でない操作の処理におけるSQL Server と Azure SQL Database の機能強化」を参照してください。

文字列リテラルを datetime2 に変換する

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

入力文字列リテラル datetime2(n)
ODBC DATE ODBC 文字列リテラルは、datetime データ型にマップされます。 ODBC DATETIMEリテラルから datetime2 型への代入操作では、変換規則で定義されているdatetimeとこの型の間で暗黙的な変換が行われます。
ODBC TIME 前の ODBC DATE ルールを参照してください。
ODBC DATETIME 前の ODBC DATE ルールを参照してください。
DATE のみ TIME パーツの既定値は00:00:00です。
TIME のみ DATE パーツの既定値は1900-01-01です。
TIMEZONE のみ 既定値が指定されます。
DATE + TIME 些細な。
DATE + TIMEZONE 許可されていません。
TIME + TIMEZONE DATE パーツの既定値は 1900-1-1 です。 TIMEZONE 入力は無視されます。
DATE + TIME + TIMEZONE ローカル 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