本主題描述在 SQL Server 2008(或更新版本)與以 SQL Server Native Client OLE DB 撰寫的用戶端應用程式之間執行的日期/時間轉換。
轉換次數
下表描述傳回給客戶端的類型與系結中型別之間的轉換。 針對輸出參數,如果已呼叫 ICommandWithParameters::SetParameterInfo,且 pwszDataSourceType 中指定的類型與伺服器上的實際類型不符,伺服器將會執行隱含轉換,而傳回給用戶端的類型將會符合透過 ICommandWithParameters::SetParameterInfo 指定的類型。 當伺服器的轉換規則與本主題所述的轉換規則不同時,這可能會導致非預期的轉換結果。 例如,必須提供預設日期時,SQL Server 會使用 1900-1-1,而不是 1899-12-30。
| 自-> 寄件者 |
日期 | DBDATE | DBTIME | DBTIME2 | DBTIMESTAMP | 資料庫時間戳偏移量 | FILETIME | 位元組 | 變體 | SSVARIANT | BSTR | STR | WSTR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 日期 | 1,7 | 還行 | - | - | 1 | 1,3 | 1,7 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| 時間 | 5,6,7 | - | 9 | 還行 | 6 | 3,6 | 5,6 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Smalldatetime | 7 | 8 | 9,10 | 10 | 還行 | 3 | 7 | - | 7 (VT_DATE) | 還行 | 還行 | 4 | 4 |
| 日期時間 | 5,7 | 8 | 9,10 | 10 | 還行 | 3 | 7 | - | 7 (VT_DATE) | 還行 | 還行 | 4 | 4 |
| Datetime2 | 5,7 | 8 | 9,10 | 10 | 7 | 3 | 5,7 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Datetimeoffset | 5,7,11 | 8,11 | 9,10,11 | 10,11 | 7,11 | 還行 | 5,7,11 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Char、Varchar、 Nchar、Nvarchar |
7, 13 | 12 | 12,9 | 12 | 12 | 12 | 7,13 | N/A | N/A | N/A | N/A | N/A | N/A |
| Sql_variant (日期時間) |
7 | 8 | 9,10 | 10 | 還行 | 3 | 7 | - | 7(VT_DATE) | 還行 | 還行 | 4 | 4 |
| Sql_variant (smalldatetime) |
7 | 8 | 9,10 | 10 | 還行 | 3 | 7 | - | 7(VT_DATE) | 還行 | 還行 | 4 | 4 |
| Sql_variant (日期) |
1,7 | 還行 | 2 | 2 | 1 | 1,3 | 1,7 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Sql_variant (時間) |
5,6,7 | 2 | 6 | 還行 | 6 | 3,6 | 5,6 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Sql_variant (datetime2) |
5,7 | 8 | 9,10 | 10 | 還行 | 3 | 5,7 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
| Sql_variant (datetimeoffset) |
5,7,11 | 8,11 | 9,10,11 | 10,11 | 7,11 | 還行 | 5,7,11 | - | 確定(VT_BSTR) | 還行 | 還行 | 4 | 4 |
符號的索引鍵
| 象徵 | 意義 |
|---|---|
| 還行 | 不需要轉換。 |
| - | 不支援轉換。 如果在呼叫 IAccessor::CreateAccessor 時驗證系結,DBBINDSTATUS_UPSUPPORTEDCONVERSION會在 rgStatus 中傳回。 延遲存取子驗證時,會設定DBSTATUS_E_BADACCESSOR。 |
| 1 | 時間欄位會設定為零。 |
| 2 | 已設定DBSTATUS_E_CANTCONVERTVALUE。 |
| 3 | 時區設定為零。 |
| 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 格式剖析成功。 若要讓 OLE 剖析成功,字串必須符合 OLE 所辨識的語法。 如果無法剖析字串,則會設定DBSTATUS_E_CANTCONVERTVALUE。 如果有任何元件值超出範圍,則會設定DBSTATUS_E_DATAOVERFLOW。 |