このトピックでは、SQL Server Native Client OLE DB と SQL Server 2008 (またはそれ以降) で記述されたクライアント アプリケーションの間で実行される日付/時刻変換について説明します。
コンバージョン
このトピックでは、クライアントで行われた変換について説明します。 サーバーで定義されているパラメーターとは異なる秒の小数部の有効桁数をクライアントが指定すると、サーバーが操作を成功させる場合に、クライアント変換でエラーが発生する可能性があります。 特に、クライアントは秒の小数部の切り捨てをエラーとして扱い、SQL Server は時間値を最も近い秒全体に丸めます。
ICommandWithParameters::SetParameterInfo が呼び出されない場合、DBTYPE_DBTIMESTAMPバインドは datetime2されたかのように変換されます。
| 宛先-> より |
DBDATE (日付) | DBTIME (時刻) | DBTIME2 (時刻) | DBTIMESTAMP (smalldatetime) | DBTIMESTAMP (datetime) | DBTIMESTAMP (datetime2) | DBTIMESTAMPOFFSET (datetimeoffset) | STR | WSTR | SQLVARIANT(エスキューエルヴァリアント) (sql_variant) |
|---|---|---|---|---|---|---|---|---|---|---|
| 日付 | 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 日付 |
| 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) |
| DBタイムスタンプ | 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) |
| DBタイムスタンプオフセット | 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) |
| バイト | - | - | - | - | - | - | - | なし | なし | なし |
| バリアント | 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 | なし | なし | なし |
記号の説明
| 記号 | 意味 |
|---|---|
| - | 変換はサポートされていません。 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 日付 (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 | DBTYPE_DATE用 SQL Server 2008 より前の変換セマンティクスは維持されます。 秒の小数部は 0 に切り捨てられます。 |
| 13 | DBTYPE_FILETIME用の SQL Server 2008 より前の変換セマンティクスは維持されます。 Windows FileTimeToSystemTime API を使用する場合、秒の小数部の有効桁数は 1 ミリ秒に制限されます。 |
| 14 |
smalldatetime用 SQL Server 2008 より前の変換セマンティクスは維持されます。 秒は 0 に設定されます。 |
| 15 |
datetime用 SQL Server 2008 より前の変換セマンティクスは維持されます。 秒は秒の最も近い 300 分の 1 に丸められます。 |
| 16 | SSVARIANT クライアント構造体に埋め込まれた (特定の型の) 値の変換動作は、SSVARIANT クライアント構造体に埋め込まれていない場合の同じ値と型の動作と同じです。 |