次の方法で共有


datetime2 (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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は、00019999年を表す 4 桁の数字です。

MMは、指定した年の月を0112表す 2 桁の数字です。

ddは、指定した月の日を0131表す月に応じて、2 桁の数値です。

HHは、0023時間を表す 2 桁の数字です。

mmは、分を表す 2 桁の数字0059です。

ssは 2 桁の数字で、00592 番目の数値を表します。

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

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

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

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

2 datetime2 値が varbinary 値にキャストされると、varbinary 値に余分なバイトが追加され、精度が格納されます。

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

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

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

ISO 8601 説明
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] この形式は、セッション ロケール設定の影響をSET LANGUAGESET DATEFORMAT受けません。 たとえばT2024-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 データ型への暗黙的な変換では、ミリ秒の小数部を計算することで精度が向上し、前の例のように異なる変換値が生成されます。 datetime データ型と datetime2 データ型が混在する比較シナリオが存在する場合は常に、datetime2 データ型への明示的なキャストを使用します。 詳細については、一部のデータ型と一般的でない操作の処理における 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 のみ パーツの既定値00:00:00TIME .
TIME のみ パーツの既定値1900-01-01DATE .
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