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 は、0001 9999 年を表す 4 桁の数字です。MM は、指定した年の月を01 12 表す 2 桁の数字です。dd は、指定した月の日を01 31 表す月に応じて、2 桁の数値です。HH は、00 23 時間を表す 2 桁の数字です。mm は、分を表す 2 桁の数字00 59 です。ss は 2 桁の数字で、00 59 2 番目の数値を表します。n* は、秒の小数部を表す 0 から 7 桁の数値0 9999999 です。 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 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 型と同じです。
下位クライアントの下位互換性
一部の下位レベル クライアントは、time、date、datetime2、datetimeoffset データ型をサポートしていません。 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:00 は TIME . |
TIME のみ |
パーツの既定値1900-01-01 は DATE . |
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 |