クライアントからサーバーへの変換
このトピックでは、OLE DB と SQL Server 2008 以降SQL Server Native Client記述されたクライアント アプリケーションの間で実行される日付/時刻変換について説明します。
コンバージョン
このトピックでは、クライアントで行われる変換について説明します。 パラメーターに対して、サーバーで定義されているのとは異なる、秒の小数部の有効桁数をクライアントで指定した場合、サーバー側で変換すると処理に成功するのに、クライアント側で変換すると処理に失敗することがあります。 具体的には、クライアントでは、秒の小数部の切り捨てがエラーとして処理されますが、SQL Server では時刻値が最も近い秒単位の値に丸められます。
ICommandWithParameters::SetParameterInfo が呼び出されない場合、DBTYPE_DBTIMESTAMPバインドは と同じように datetime2
変換されます。
To -> ソース |
DBDATE (date) | DBTIME (time) | DBTIME2 (time) | DBTIMESTAMP (smalldatetime) | DBTIMESTAMP (datetime) | DBTIMESTAMP (datetime2) | DBTIMESTAMPOFFSET (datetimeoffset) | STR | WSTR | SQLVARIANT (sql_variant) |
---|---|---|---|---|---|---|---|---|---|---|
DATE | 1、2 | 1,3,4 | 4,12 | 1,12 | 1,12 | 1,12 | 1,5, 12 | 1,12 | 1,12 | 1,12 datetime2(0) |
DBDATE | 1 | - | - | 1、6 | 1、6 | 1、6 | 1,5, 6 | 1,10 | 1,10 | 1 date |
DBTIME | - | 1 | 1 | 1,7 | 1,7 | 1,7 | 1,5, 7 | 1,10 | 1,10 | 1 Time(0) |
DBTIME2 | - | 1,3 | 1 | 1,7,10,14 | 1,7,10,15 | 1,7,10 | 1,5,7,10 | 1,10,11 | 1,10,11 | 1 Time(7) |
DBTIMESTAMP | 1、2 | 1,3,4 | 1,4,10 | 1,10,14 | 1,10,15 | 1,10 | 1,5,10 | 1,10,11 | 1,10,11 | 1,10 datetime2(7) |
DBTIMESTAMPOFFSET | 1,2,8 | 1,3,4,8 | 1,4,8,10 | 1,8,10,14 | 1,8,10,15 | 1,8,10 | 1,10 | 1,10,11 | 1,10,11 | 1,10 datetimeoffset(7) |
FILETIME | 1、2 | 1,3,4 | 1,4,13 | 1,13 | 1,13 | 1,13 | 1,5,13 | 1,13 | 1,10 | 1,13 datetime2(3) |
BYTES | - | - | - | - | - | - | - | 該当なし | 該当なし | 該当なし |
VARIANT | 1 | 1 | 1 | 1,10 | 1,10 | 1,10 | 1,10 | 該当なし | 該当なし | 1,10 |
SSVARIANT | 1,16 | 1,16 | 1,16 | 1,10,16 | 1,10,16 | 1,10,16 | 1,10,16 | 該当なし | 該当なし | 1,16 |
BSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 該当なし | 該当なし | 該当なし |
STR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 該当なし | 該当なし | 該当なし |
WSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 該当なし | 該当なし | 該当なし |
記号の説明
Symbol | 意味 |
---|---|
- | 変換はサポートされていません。 IAccessor::CreateAccessor の呼び出し時にバインドが検証される場合、DBBINDSTATUS_UPSUPPORTEDCONVERSION が rgStatus で返されます。 アクセサー検証が遅延する場合は、DBSTATUS_E_BADACCESSOR が設定されます。 |
該当なし | 適用不可。 |
1 | 指定されたデータが有効でない場合、DBSTATUS_E_CANTCONVERTVALUE が設定されます。 入力データが検証されてから変換が適用されるので、コンポーネントは後続の変換で無視されることがあっても、変換を成功させるには有効である必要があります。 |
2 | 時刻フィールドは無視されます。 |
3 | 秒の小数部は 0 である必要があります。そうでなければ、DBSTATUS_E_DATAOVERFLOW が設定されます。 |
4 | 日付部分は無視されます。 |
5 | タイム ゾーンには、クライアントのタイム ゾーン設定が設定されます。 |
6 | 時刻は 0 に設定されます。 |
7 | 日付は現在の日付に設定されます。 |
8 | 時刻は UTC に変換されます。 この変換中にエラーが発生した場合、DBSTATUS_E_CANTCONVERTVALUE が設定されます。 |
9 | 文字列は ISO リテラルとして解析され、対象の型に変換されます。 これが失敗すると、文字列は OLE 日付リテラル (時刻要素も含む) として解析され、OLE Date (DBTYPE_DATE) から対象の型に変換されます。 対象の型が DBTIMESTAMP、 smalldatetime 、datetime 、または datetime2 の場合、文字列は日付リテラル、時刻リテラル、または datetime2 リテラルの構文か、OLE で認識される構文に準拠している必要があります。 文字列が日付リテラルの場合、すべての時刻部分が 0 に設定されます。 文字列が時刻リテラルの場合、日付は現在の日付に設定されます。その他の対象の型の場合、文字列は対象の型のリテラルの構文に準拠している必要があります。 |
10 | データ損失を伴って秒の小数部が切り捨てられる場合、DBSTATUS_E_DATAOVERFLOW が設定されます。 文字列変換では、文字列が ISO 構文に準拠している場合のみオーバーフロー チェックが有効になります。 文字列が OLE 日付リテラルの場合、秒の小数部は丸められます。 DBTIMESTAMP (datetime) から smalldatetime への変換では SQL Server Native Client、DBSTATUS_E_DATAOVERFLOW エラーを発生させる代わりに、秒の値が自動的に切り捨てられます。 |
11 | 秒の小数点以下桁数は、次の表に従って、変換先の列のサイズによって決まります。 テーブルの範囲よりサイズが大きい列の場合は、9 桁と見なされます。 この変換では、秒の小数点以下桁数が 9 桁まで許容されます。これは、OLE DB で許容される最大桁数です。 ただし、変換元の型が DBTIMESTAMP で、秒の小数部が 0 の場合、秒の小数部または小数点は生成されません。 この動作により、以前の OLE DB プロバイダーを使用して開発されたアプリケーションの下位互換性が保証されます。 列サイズが 0 より小さい場合は、OLE DB ではサイズが無制限であることを意味します (DBTIMESTAMP の 3 桁ルールが適用されなければ 9 桁)。 DBTIME2 - 8、10..18 (文字数);0、1..9 (スケール) DBTIMESTAMP - 19、21..29 (文字数);0、1..9 (スケール) DBTIMESTAMPOFFSET - 26,28..36 (文字数);0、1..9 (スケール) |
12 | SQL Server 2008 より前のバージョンの DBTYPE_DATE に対する変換セマンティクスが保持されます。 秒の小数部は 0 に切り捨てられます。 |
13 | SQL Server 2008 より前のバージョンの DBTYPE_FILETIME に対する変換セマンティクスが保持されます。 Windows FileTimeToSystemTime API を使用する場合、1 秒未満の秒の有効桁数は 1 ミリ秒に制限されます。 |
14 | SQL Server 2008 より前のsmalldatetime 変換セマンティクスは保持されます。 秒は 0 に設定されます。 |
15 | SQL Server 2008 より前のdatetime 変換セマンティクスは保持されます。 秒は、1/300 秒単位に丸められます。 |
16 | SSVARIANT クライアントの構造体に埋め込まれた (特定の型の) 値の変換動作は、SSVARIANT クライアントの構造体に埋め込まれていない場合の同一の値および型の動作と同じです。 |