本主題描述使用 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 時間(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 時間(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) |
| 資料庫時間戳偏移量 | 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) |
| 位元組 | - | - | - | - | - | - | - | N/A | N/A | N/A |
| 變體 | 1 | 1 | 1 | 1,10 | 1,10 | 1,10 | 1,10 | N/A | N/A | 1,10 |
| SSVARIANT | 1,16 | 1,16 | 1,16 | 1,10,16 | 1,10,16 | 1,10,16 | 1,10,16 | N/A | N/A | 1,16 |
| BSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | N/A | N/A | N/A |
| STR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | N/A | N/A | N/A |
| WSTR | 1,9 | 1,9 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | 1,9,10 | N/A | N/A | N/A |
符號的索引鍵
| 象徵 | 意義 |
|---|---|
| - | 不支援轉換。 如果在呼叫 IAccessor::CreateAccessor 時驗證系結,DBBINDSTATUS_UPSUPPORTEDCONVERSION會在 rgStatus 中傳回。 延遲存取子驗證時,會設定DBSTATUS_E_BADACCESSOR。 |
| N/A | 不適用。 |
| 1 | 如果提供的數據無效,則會設定DBSTATUS_E_CANTCONVERTVALUE。 輸入數據會在套用轉換之前進行驗證,因此即使後續轉換會忽略元件,轉換仍必須有效才能成功。 |
| 2 | 系統會忽略時間欄位。 |
| 3 | 小數秒必須是零或設定DBSTATUS_E_DATAOVERFLOW。 |
| 4 | 忽略日期元件。 |
| 5 | 時區設定為用戶端的時區設定。 |
| 6 | 時間會設定為零。 |
| 7 | 日期會設定為目前的日期。 |
| 8 | 時間會轉換成UTC。 如果此轉換期間發生錯誤,則會設定DBSTATUS_E_CANTCONVERTVALUE。 |
| 9 | 字串會剖析為 ISO 常值,並轉換成目標類型。 如果失敗,字串會剖析為 OLE 日期常值(它也具有時間元件),並從 OLE 日期 (DBTYPE_DATE) 轉換為目標類型。 如果目標類型是 DBTIMESTAMP、 smalldatetime、 datetime或 datetime2,字串必須符合日期、時間或常值語法 datetime2 ,或 OLE 所辨識的語法。 如果字串是日期常值,則所有時間元件都會設定為零。 如果字串是時間常值,日期會設定為目前的日期。對於所有其他目標類型,字串必須符合目標型別常值的語法。 |
| 10 | 如果發生數據遺失的小數秒截斷,則會設定DBSTATUS_E_DATAOVERFLOW。 針對字串轉換,只有在字串符合 ISO 語法時,才能進行溢位檢查。 如果字串是 OLE 日期常值,則會四捨五入小數秒。 若要從 DBTIMESTAMP (datetime) 轉換為 smalldatetime SQL Server Native Client,將會以無訊息方式截斷秒值,而不是引發DBSTATUS_E_DATAOVERFLOW錯誤。 |
| 11 | 根據下表,小數秒位數(小數字數)是從目的地數據行的大小決定。 對於大於資料表中範圍的資料行大小,會隱含小數位數 9。 此轉換應該最多允許九個小數秒位數,也就是 OLE DB 所允許的最大值。 不過,如果來源類型為 DBTIMESTAMP,而小數秒為零,則不會產生小數秒位數或小數點。 此行為可確保使用舊版 OLE DB 提供者所開發之應用程式的回溯相容性。 ~0 的數據行大小表示 OLE DB 中無限制的大小(9 位數,除非套用 DBTIMESTAMP 的 3 位數規則)。 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 for DBTYPE_DATE 之前的轉換語意會維持。 小數秒會截斷為零。 |
| 13 | SQL Server 2008 for DBTYPE_FILETIME 之前的轉換語意會維持。 如果您使用 Windows FileTimeToSystemTime API,小數秒精確度會限制為 1 毫秒。 |
| 14 | 會維護 SQL Server 2008 smalldatetime 之前的轉換語意。 秒數設定為零。 |
| 15 | 會維護 SQL Server 2008 datetime 之前的轉換語意。 秒會四捨五入為秒的最接近第 300 個。 |
| 16 | 內嵌在 SSVARIANT 用戶端結構中的值轉換行為,與未內嵌在 SSVARIANT 用戶端結構中的相同值和型別的行為相同。 |