從伺服器到用戶端執行的轉換
適用於:SQL Server Azure SQL 資料 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
本文說明在 SQL Server 2008 (10.0.x) 和更新版本與使用 OLE DB Driver for SQL Server 所撰寫之用戶端應用程式間執行的日期/時間轉換。
轉換
下表描述傳回用戶端之類行與繫結中之類型之間的轉換。 對於輸出參數,如果已呼叫 ICommandWithParameters::SetParameterInfo,而且在 pwszDataSourceType 中指定的類型與伺服器上的實際類型不符,伺服器將會執行隱含轉換,而且傳回到用戶端的類型將會與透過 ICommandWithParameters::SetParameterInfo 指定的類型相符。 當伺服器的轉換規則與本文中描述的規則不同時,這可能會導致非預期的轉換結果。 例如,當必須提供預設日期時,SQL Server 會使用 1900-1-1 而非 1899-12-30。
至 -> 從 |
日期 | DBDATE | DBTIME | DBTIME2 | DBTIMESTAMP | DBTIMESTAMPOFFSET | FILETIME | BYTES | VARIANT | SSVARIANT | BSTR | STR | WSTR |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | 1, 7 | [確定] | - | - | 1 | 1, 3 | 1, 7 | - | [確定] \(VT_BSTR) | [確定] | [確定] | 4 | 4 |
Time | 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 |
Datetime | 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 (datetime) |
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 (date) |
1, 7 | [確定] | 2 | 2 | 1 | 1, 3 | 1, 7 | - | OK(VT_BSTR) | [確定] | [確定] | 4 | 4 |
Sql_variant (time) |
5, 6, 7 | 2 | 6 | [確定] | 6 | 3, 6 | 5, 6 | - | OK(VT_BSTR) | [確定] | [確定] | 4 | 4 |
Sql_variant (datetime2) |
5, 7 | 8 | 9, 10 | 10 | [確定] | 3 | 5, 7 | - | OK(VT_BSTR) | [確定] | [確定] | 4 | 4 |
Sql_variant (datetimeoffset) |
5, 7, 11 | 8, 11 | 9, 10, 11 | 10, 11 | 7, 11 | [確定] | 5, 7, 11 | - | OK(VT_BSTR) | [確定] | [確定] | 4 | 4 |
符號的索引鍵
符號 | 意義 |
---|---|
[確定] | 不需要任何轉換。 |
- | 不支援轉換。 如果繫結在呼叫 IAccessor::CreateAccessor 時通過驗證,則會在 rgStatus 中傳回 DBBINDSTATUS_UPSUPPORTEDCONVERSION。 當存取子驗證延遲時,會設定 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,否則字串必須符合日期時間常值的語法。 如果是這種狀況,ISO 格式剖析允許使用日期時間或時間嘗試才會成功。 若要讓 OLE 剖析成功,字串必須符合 OLE 所識別的語法。 如果無法剖析字串,則會設定 DBSTATUS_E_CANTCONVERTVALUE。 如果任何元件值超出範圍,會設定 DBSTATUS_E_DATAOVERFLOW。 |