Share via


datetimeoffset (Transact-SQL)

タイム ゾーンを認識する 24 時間形式の時刻と組み合わせた日付を定義します。

datetimeoffset の説明

プロパティ

構文

datetimeoffset [ (fractional seconds precision) ]

使用方法

DECLARE @MyDatetimeoffset datetimeoffset(7)

CREATE TABLE Table1 ( Column1 datetimeoffset(7) )

既定の文字列リテラル形式 (下位クライアント用)

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

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

日付範囲

0001-01-01 ~ 9999-12-31

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

時刻範囲

00:00:00 ~ 23:59:59.9999999

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

-14:00 ~ +14:00

要素範囲

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)。

hh は、-14 ~ +14 までの 2 桁の数字です。

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

文字長

26 文字 (YYYY-MM-DD hh:mm:ss {+|-}hh:mm) 以上、34 文字 (YYYY-MM-DD hh:mm:ss. nnnnnnn {+|-}hh:mm) 以下

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

指定した小数点以下桁数

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

列長 (バイト単位)

1 秒未満の秒の有効桁数

datetimeoffset

(34,7)

10

7

datetimeoffset(0)

(26,0)

8

0-2

datetimeoffset(1)

(28,1)

8

0-2

datetimeoffset(2)

(29,2)

8

0-2

datetimeoffset(3)

(30,3)

9

3-4

datetimeoffset(4)

(31,4)

9

3-4

datetimeoffset(5)

(32,5)

10

5-7

datetimeoffset(6)

(33,6)

10

5-7

datetimeoffset(7)

(34,7)

10

5-7

ストレージのサイズ

既定では 10 バイト固定 (秒部分の既定の有効桁数は 100ns) です。

精度

100 ナノ秒

既定値

1900-01-01 00:00:00 00:00

カレンダー

グレゴリオ暦

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

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

夏時間への対応

不可

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

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

ISO 8601

説明

YYYY-MM-DDThh:mm:ss[. nnnnnnn][{+|-}hh:mm]

この 2 つの形式は、セッションのロケール設定である SET LANGUAGE および SET DATEFORMAT の影響を受けません。 datetimeoffset 部分と datetime 部分の間にスペースは使用できません。

YYYY-MM-DDThh:mm:ss[. nnnnnnn]Z (UTC)

ISO 定義に基づくこの形式は、datetime 部分を協定世界時 (UTC) で指定する必要があることを示します。 たとえば、1999-12-12 12:30:30.12345 -07:00 は 1999-12-12 19:30:30.12345Z と表す必要があります。

タイム ゾーン オフセット

タイム ゾーン オフセットは、time 値または datetime 値の UTC を基準とした相対値を指定します。 タイム ゾーン オフセットは、[+|-] hh:mm として表すことができます。

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

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

  • タイム ゾーン オフセットでは、+ (正負号) または – (負符号) を必ず指定します。 ローカル時刻を取得する際、UTC 時刻を基準としてタイム ゾーン オフセットを加算するか、減算するかを示します。 タイム ゾーン オフセットの有効範囲は -14:00 ~ +14:00 までです。

タイム ゾーン オフセットの範囲は、XSD スキーマ定義の W3C XML 標準に準拠しており、SQL 2003 標準の定義 (12:59 ~ +14:00) とは若干異なります。

fractional seconds precision は、1 秒未満の桁数を指定するオプションのパラメーターです。 この値は、0 ~ 7 (100 ナノ秒) の整数で指定できます。 fractional seconds precision の既定値は 100ns (1 秒未満の桁数は 7 桁) です。

データベースに格納されたデータは、サーバーで UTC として処理、比較、並べ替え、およびインデックス化されます。 タイム ゾーン オフセットは、データベースに保持され、必要に応じて取得できます。

datetime が DST 期間に該当する場合、指定したタイム ゾーン オフセットは、夏時間 (DST) が認識されて調整されるものと見なされます。

datetimeoffset 型では、挿入、更新、算術演算、変換、代入などの操作時に、UTC とローカルの両方の datetime 値 (保持されたタイム ゾーン オフセットと変換後のタイム ゾーン オフセット) が検証されます。 保持されたタイム ゾーン オフセットまたは変換後のタイム ゾーン オフセットに対して、無効な UTC またはローカル datetime 値が検出された場合は、無効な値であることを示すエラーが生成されます。 たとえば、9999-12-31 10:10:00 は UTC では有効ですが、タイム ゾーン オフセットを +13:50 に設定したローカル時間ではオーバーフローします。

ANSI および ISO 8601 への準拠

date」および「time」トピックの「ANSI および ISO 8601 への準拠」セクションに書かれている内容は、datetimeoffset にも当てはまります。

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

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

datetimeoffset データ型の他の日付/時刻データ型への変換

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

変換先のデータ型

変換の詳細

date

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

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

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date date= @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date';
--Result
--@datetimeoffset                date
-------------------------------- ----------
--2025-12-10 12:32:10.0000 +01:0 2025-12-10
--
--(1 row(s) affected)

time(n)

時間、分、秒、および秒の小数部がコピーされます。 タイム ゾーンの値は切り捨てられます。 datetimeoffset(n) 値の有効桁数が time(n) 値の有効桁数を超える場合、値は切り上げられます。

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

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time time(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';
--Result
--@datetimeoffset                time
-------------------------------- ------------
-- 2025-12-10 12:32:10.1237 +01:00    12:32:10.124
--
--(1 row(s) affected)

datetime

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

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

DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime datetime = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';
--Result
--@datetimeoffset                datetime
-------------------------------- -----------------------
--2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

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

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

DECLARE @datetimeoffset datetimeoffset(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime smalldatetime = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';
--Result
--@datetimeoffset                @smalldatetime
-------------------------------- -----------------------
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
--
--(1 row(s) affected)

datetime2(n)

日付と時刻が datetime2 値にコピーされ、タイム ゾーンが切り捨てられます。 datetime2(n) 値の有効桁数が datetimeoffset(n) 値の有効桁数を超える場合、秒の小数部はその桁数に合わせて切り捨てられます。

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

DECLARE @datetimeoffset datetimeoffset(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 datetime2(3)=@datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';
--Result
@datetimeoffset                    @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12
--(1 row(s) affected)

文字列リテラルの datetimeoffset への変換

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

入力文字列リテラル

datetimeoffset(n)

ODBC 日付

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

ODBC 時刻

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

ODBC 日付時刻

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

日付のみ

時刻部分は既定値の 00:00:00 に設定される タイム ゾーンは既定値の +00:00 に設定される

時刻のみ

日付部分は既定値の 1900-1-1 に設定される タイム ゾーンは既定値の +00:00 に設定される

タイム ゾーンのみ

既定値が設定される

日付 + 時刻

タイム ゾーンは既定値の +00:00 に設定される

日付 + タイム ゾーン

使用不可

時刻 + タイム ゾーン

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

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

単純変換

使用例

次の例では、文字列をそれぞれの 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'
    ,CAST('2007-05-08 12:35:29.1234567+12:15' AS datetimeoffset(7)) AS
        'datetimeoffset IS08601';

以下に結果セットを示します。

データ型

出力

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)