次の方法で共有


サーバーからクライアントへの変換

このトピックでは、SQL Server 2008 (またはそれ以降) と SQL Server Native Client OLE DB で記述されたクライアント アプリケーションの間で実行される日付/時刻変換について説明します。

コンバージョン

次の表では、クライアントに返される型とバインド内の型の間の変換について説明します。 出力パラメーターの場合、ICommandWithParameters::SetParameterInfo が呼び出され、 pwszDataSourceType で指定された型がサーバー上の実際の型と一致しない場合、サーバーによって暗黙的な変換が実行され、クライアントに返される型は ICommandWithParameters::SetParameterInfo で指定された型と一致します。 これにより、サーバーの変換規則がこのトピックで説明されているものと異なる場合に、予期しない変換結果が発生する可能性があります。 たとえば、既定の日付を指定する必要がある場合、SQL Server では 1899-12-30 ではなく 1900-1-1 が使用されます。

宛先->

より
日付 DBDATE DBTIME DBTIME2 DBタイムスタンプ DBタイムスタンプオフセット FILETIME バイト バリアント SSVARIANT BSTR STR WSTR
日付 1,7 [OK] - - 1 1,3 1,7 - OK (VT_BSTR) [OK] [OK] 4 4
時間 5,6,7 - 9 [OK] 6 3、6 5,6 - OK (VT_BSTR) [OK] [OK] 4 4
Smalldatetime 7 8 9、10 10 [OK] 3 7 - 7 (VT_DATE) [OK] [OK] 4 4
日時 5,7 8 9、10 10 [OK] 3 7 - 7 (VT_DATE) [OK] [OK] 4 4
日付時刻2 5,7 8 9、10 10 7 3 5,7 - OK (VT_BSTR) [OK] [OK] 4 4
Datetimeoffset 5,7,11 8,11 9,10,11 10,11 7,11 [OK] 5,7,11 - OK (VT_BSTR) [OK] [OK] 4 4
Char、Varchar、

Nchar、Nvarchar
7, 13 12 12,9 12 12 12 7,13 なし なし なし なし なし なし
Sql_variant

(datetime)
7 8 9、10 10 [OK] 3 7 - 7(VT_DATE) [OK] [OK] 4 4
Sql_variant

(smalldatetime)
7 8 9、10 10 [OK] 3 7 - 7(VT_DATE) [OK] [OK] 4 4
Sql_variant

(日付)
1,7 [OK] 2 2 1 1,3 1,7 - OK(VT_BSTR) [OK] [OK] 4 4
Sql_variant

(時間)
5,6,7 2 6 [OK] 6 3、6 5,6 - OK(VT_BSTR) [OK] [OK] 4 4
Sql_variant

(datetime2)
5,7 8 9、10 10 [OK] 3 5,7 - OK(VT_BSTR) [OK] [OK] 4 4
Sql_variant

(datetimeoffset)
5,7,11 8,11 9,10,11 10,11 7,11 [OK] 5,7,11 - OK(VT_BSTR) [OK] [OK] 4 4

記号の説明

記号 意味
[OK] 変換は必要ありません。
- 変換はサポートされていません。 IAccessor::CreateAccessor が呼び出されたときにバインディングが検証された場合、 DBBINDSTATUS_UPSUPPORTEDCONVERSIONは rgStatus で返されます。 アクセサーの検証が遅延されると、DBSTATUS_E_BADACCESSORが設定されます。
1 時刻フィールドは 0 に設定されます。
2 DBSTATUS_E_CANTCONVERTVALUEが設定されています。
3 タイムゾーンは 0 に設定されます。
4 クライアント バッファーのサイズが十分でない場合は、DBSTATUS_S_TRUNCATEDが設定されます。 サーバーの種類に秒の小数部が含まれている場合、結果文字列の桁数はサーバーの種類のスケールと正確に一致します。
5 秒または秒の小数部の切り捨ては無視されます。
6 ソースが文字列時刻リテラルで宛先がDBTYPE_DATEされていない限り、日付は現在の日付に設定されます。 この場合、1899-12-30 が使用されます。
7 値がオーバーフローすると、DBSTATUS_E_DATAOVERFLOWが設定されます。
8 時刻フィールドは無視されます。
9 秒の小数部フィールドは無視されます。
10 日付部分は無視されます。
11 時刻はクライアントのタイムゾーンに変換されます。 この変換中にエラーが発生した場合は、DBSTATUS_E_DATAOVERFLOWが設定されます。
12 文字列は ISO リテラルとして解析され、ターゲット型に変換されます。 これが失敗した場合、文字列は OLE 日付リテラル (時刻コンポーネントも含む) として解析され、OLE 日付 (DBTYPE_DATE) からターゲット型に変換されます。 文字列は、ISO 形式の解析が成功するために許可されるターゲット型のリテラルの構文に準拠している必要があります。 OLE の解析を成功させるには、文字列が OLE で認識される構文に準拠している必要があります。 文字列を解析できない場合は、DBSTATUS_E_CANTCONVERTVALUEが設定されます。 コンポーネントの値が範囲外の場合は、DBSTATUS_E_DATAOVERFLOWが設定されます。
13 文字列は ISO リテラルとして解析され、ターゲット型に変換されます。 これが失敗した場合、文字列は OLE 日付リテラル (時刻コンポーネントも含む) として解析され、OLE 日付 (DBTYPE_DATE) からターゲット型に変換されます。 宛先がDBTYPE_DATEまたはDBTYPE_DBTIMESTAMPでない限り、文字列は datetime リテラルの構文に準拠している必要があります。 この場合、ISO 形式の解析が成功するには、datetime リテラルまたは時刻リテラルを使用できます。 OLE の解析を成功させるには、文字列が OLE で認識される構文に準拠している必要があります。 文字列を解析できない場合は、DBSTATUS_E_CANTCONVERTVALUEが設定されます。 コンポーネントの値が範囲外の場合は、DBSTATUS_E_DATAOVERFLOWが設定されます。

こちらもご覧ください

バインドと変換 (OLE DB)