このトピックでは、日付と時刻のデータ型の実装パラメーター記述子 (IPD) フィールドと実装行記述子 (IRD) フィールドで返される内容について説明します。
IPD フィールドで返される情報
IPD フィールドには、次の情報が返されます。
| パラメーターのタイプ | 日付 | 時間 | smalldatetime(スモールデイトタイム) | datetime | datetime2 | datetimeoffset (デイトタイムオフセット) |
|---|---|---|---|---|---|---|
| SQL_DESC_CASE_SENSITIVE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
| SQL_DESC_CONCISE_TYPE | SQL_TYPE_DATE | SQL_SS_TIME2 | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) |
| SQL_DESC_DATETIME_INTERVAL_CODE | SQL_CODE_DATE | 0 | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | 0 |
| SQL_DESC_DATETIME_INTERVAL_PRECISION | 10 | 8,10..16 | 16 | 23 | 19、21..27 | 26、28..34 |
| SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
| SQL_DESC_LENGTH | 10 | 8,10..16 | 16 | 23 | 19、21..27 | 26、28..34 |
| SQL_DESC_OCTET_LENGTH | 6 | 12 | 4 | 8 | 16 | 20 |
| SQL_DESC_PRECISION | 0 | 0..7 | 0 | 3 | 0..7 | 0..7 |
| SQL_DESC_SCALE | 0 | 0..7 | 0 | 3 | 0..7 | 0..7 |
| SQL_DESC_TYPE | SQL_TYPE_DATE | SQL_SS_TYPE_TIME2 | SQL_DATETIME | SQL_DATETIME | SQL_DATETIME | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) |
| SQL_DESC_TYPE_NAME | date |
time |
smalldatetimeIRD では、IPD でdatetime2 |
datetimeIRD では、IPD でdatetime2 |
datetime2 |
datetimeoffset (デイトタイムオフセット) |
| SQL_CA_SS_VARIANT_TYPE | SQL_C_TYPE_DATE | SQL_C_TYPE_BINARY | SQL_C_TYPE_TIMESTAMP | SQL_C_TYPE_TIMESTAMP | SQL_C_TYPE_TIMESTAMP | SQL_C_TYPE_BINARY |
| SQL_CA_SS_VARIANT_SQL_TYPE | SQL_TYPE_DATE | SQL_SS_TIME2 | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) |
| SQL_CA_SS_SERVER_TYPE | なし | なし | SQL_SS_TYPE_SMALLDATETIME | SQL_SS_TYPE_DATETIME | SQL_SS_TYPE_DEFAULT | なし |
値の範囲に不連続性がある場合があります。 たとえば、8,10..16 では 9 がありません。 有効桁数が 0 より大きい場合は、小数点が追加されるためです。
datetime2 は、 smalldatetime と datetime の型名として返されます。これは、ドライバーが、すべての SQL_TYPE_TIMESTAMP 値をサーバーに送信するための共通の型として使用するためです。
SQL_CA_SS_VARIANT_SQL_TYPEは新しい記述子フィールドです。 このフィールドは IRD および IPD に追加され、アプリケーションで sqlvariant (SQL_SSVARIANT) 列とパラメーターに関連付けられている値の型を指定できます
SQL_CA_SS_SERVER_TYPEは、SQL_TYPE_TYPETIMESTAMP (または C 型のSQL_C_TYPE_TIMESTAMPでSQL_SS_VARIANTとして) バインドされたパラメーターの値をサーバーに送信する方法をアプリケーションが制御できるようにする新しい IPD 専用フィールドです。 sqlExecute または SQLExecDirect が呼び出されたときにSQL_DESC_CONCISE_TYPEがSQL_TYPE_TIMESTAMP (またはSQL_SS_VARIANTで C 型がSQL_C_TYPE_TIMESTAMP) 場合、SQL_CA_SS_SERVER_TYPEの値によって、パラメーター値の表形式データ ストリーム (TDS) 型が次のように決定されます。
| SQL_CA_SS_SERVER_TYPEの値 | SQL_DESC_PRECISIONの有効な値 | SQL_DESC_LENGTHの有効な値 | TDS の種類 |
|---|---|---|---|
| SQL_SS_TYPE_DEFAULT | 0..7 | 19、21..27 | datetime2 |
| SQL_SS_TYPE_SMALLDATETIME | 0 | 19 | smalldatetime |
| SQL_SS_TYPE_DATETIME | 3 | 23 | datetime |
SQL_CA_SS_SERVER_TYPEの既定の設定はSQL_SS_TYPE_DEFAULTです。 SQL_DESC_PRECISIONとSQL_DESC_LENGTHの設定は、上記の表に示すように、SQL_CA_SS_SERVER_TYPEの設定で検証されます。 この検証が失敗すると、SQL_ERRORが返され、SQLState 07006 と "Restricted data type attribute violation" というメッセージで診断レコードがログに記録されます。 このエラーは、SQL_CA_SS_SERVER_TYPEが SQL_SS_TYPE DEFAULT 以外の値に設定されていて、DESC_CONCISE_TYPEがSQL_TYPE_TIMESTAMPされていない場合にも返されます。 これらの検証は、記述子の整合性検証が行われるときに実行されます。次に例を示します。
SQL_DESC_DATA_PTRが変更されたとき。
準備時または実行時 (SQLExecute、SQLExecDirect、SQLSetPos、または SQLBulkOperations が呼び出されたとき)。
遅延準備を無効にして SQLPrepare を呼び出すか、準備されているが実行されないステートメントに対して SQLNumResultCols、SQLDescribeCol、または SQLDescribeParam を呼び出すことによって、アプリケーションが非遅延準備を強制する場合。
SQLSetDescField の呼び出しによってSQL_CA_SS_SERVER_TYPEが設定されている場合、その値はSQL_SS_TYPE_DEFAULT、SQL_SS_TYPE_SMALLDATETIME、またはSQL_SS_TYPE_DATETIMEである必要があります。 そうでない場合は、SQL_ERRORが返され、SQLState HY092 と "無効な属性/オプション識別子" というメッセージで診断レコードがログに記録されます。
SQL_CA_SS_SERVER_TYPE属性は、 datetime および smalldatetimeでサポートされている機能に依存するアプリケーションで使用できますが、 datetime2では使用できません。 たとえば、 datetime2 では dateadd 関数と datediif 関数を使用する必要があります。一方、 datetime と smalldatetime では算術演算子も使用できます。 ほとんどのアプリケーションでは、この属性を使用する必要はありません。また、その使用は避ける必要があります。
IRD フィールドで返される情報
IRD フィールドには、次の情報が返されます。
| 列の種類 | 日付 | 時間 | smalldatetime(スモールデイトタイム) | datetime | datetime2 | datetimeoffset (デイトタイムオフセット) |
|---|---|---|---|---|---|---|
| SQL_DESC_AUTO_UNIQUE_VALUE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
| SQL_DESC_CASE_SENSITIVE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
| SQL_DESC_CONCISE_TYPE | SQL_TYPE_DATE | SQL_SS_TIME2 | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) |
| SQL_DESC_DATETIME_INTERVAL_CODE | SQL_CODE_DATE | 0 | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | 0 |
| SQL_DESC_DATETIME_INTERVAL_PRECISION | 10 | 8,10..16 | 16 | 23 | 19、21..27 | 26、28..34 |
| SQL_DESC_DISPLAY_SIZE | 10 | 8,10..16 | 16 | 23 | 19、21..27 | 26、28..34 |
| SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
| SQL_DESC_LENGTH | 10 | 8,10..16 | 16 | 2 | 19、21..27 | 26、28..34 |
| SQL_DESC_LITERAL_PREFIX | ' | ' | ' | ' | ' | ' |
| SQL_DESC_LITERAL_SUFFIX | ' | ' | ' | ' | ' | ' |
| SQL_DESC_LOCAL_TYPE_NAME | date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset (デイトタイムオフセット) |
| SQL_DESC_OCTET_LENGTH | 6 | 12 | 4 | 8 | 16 | 20 |
| SQL_DESC_PRECISION | 0 | 0..7 | 0 | 3 | 0..7 | 0..7 |
| SQL_DESC_SCALE | 0 | 0..7 | 0 | 3 | 0..7 | 0..7 |
| SQL_DESC_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE |
| SQL_DESC_TYPE | SQL_DATETIME | SQL_SS_TIME2 | SQL_DATETIME | SQL_DATETIME | SQL_DATETIME | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) |
| SQL_DESC_TYPE_NAME | date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset (デイトタイムオフセット) |
| SQL_DESC_UNSIGNED | SQL_TRUE | SQL_TRUE | SQL_TRUE | SQL_TRUE | SQL_TRUE | SQL_TRUE |