datetime 資料類型從 SQL 轉換成 C
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
下表列出當您從 SQL Server 日期/時間類型轉換成 C 類型時應考慮的問題。
轉換
SQL_C_DATE | SQL_C_TIME | SQL_C_TIMESTAMP | SQL_C_SS_TIME2 | SQL_C_SS_TIMESTAMPOFFSET | SQL_C_BINARY | SQL_C_CHAR | SQL_C_WCHAR | |
---|---|---|---|---|---|---|---|---|
SQL_CHAR | 2,3,4,5 | 2,3,6,7,8 | 2,3,9,10,11 | 2,3,6,7 | 2,3,9,10,11 | 1 | 1 | 1 |
SQL_WCHAR | 2,3,4,5 | 2,3,6,7,8 | 2,3,9,10,11 | 2,3,6,7 | 2,3,9,10,11 | 1 | 1 | 1 |
SQL_TYPE_DATE | 確定 | 12 | 13 | 12 | 13,23 | 14 | 16 | 16 |
SQL_SS_TIME2 | 12 | 8 | 15 | 確定 | 10,23 | 17 | 16 | 16 |
SQL_TYPE_TIMESTAMP | 18 | 7,8 | 確定 | 7 | 23 | 19 | 16 | 16 |
SQL_SS_TIMESTAMPOFFSET | 18,22 | 7,8,20 | 20 | 7,20 | 確定 | 21 | 16 | 16 |
符號的索引鍵
符號 | 意義 |
---|---|
[確定] | 沒有轉換問題。 |
1 | SQL Server 2008 之前的規則(10.0.x) 適用。 |
2 | 會忽略前置和尾端空格。 |
3 | 字串會剖析成日期、時間、時區或時區offset,並允許小數秒最多 9 位數。 如果剖析時區offset,時間就會轉換成用戶端時區。 如果在轉換期間發生錯誤,就會產生 SQLSTATE 22018 和訊息「日期時間欄位溢位」的診斷記錄。 |
4 | 如果值不是有效的日期、時間戳或 timestampoffset 值,則會使用 SQLSTATE 22018 和訊息「轉換規格的字元值無效」產生診斷記錄。 |
5 | 如果時間不是零,就會使用 SQLSTATE 01S07 和訊息「小數截斷」產生診斷記錄。 |
6 | 如果值不是有效的時間、時間戳或 timestampoffset 值,則診斷記錄會產生 SQLSTATE 22018 和訊息「轉換規格的字元值無效」。 |
7 | 忽略日期元件。 |
8 | 如果小數秒不是零,則會使用 SQLSTATE 01S07 和訊息「小數截斷」產生診斷記錄。 |
9 | 如果值不是有效的日期、時間、時間戳或 timestampoffset 值,則會使用 SQLSTATE 22018 和訊息「轉換規格的字元值無效」產生診斷記錄。 |
10 | 如果值是有效的時間,日期元件會設定為目前的用戶端日期。 |
11 | 如果值是有效的日期,時間會設定為零。 |
12 | 診斷記錄會產生 SQLSTATE 07006 和訊息「限制數據類型屬性違規」。 |
13 | 時間會設定為零。 |
14 | 如果緩衝區不夠大,無法容納SQL_DATE_STRUCT,則會使用 SQLSTATE 22003 和訊息「數值超出範圍」產生診斷記錄。 |
15 | 日期會設定為目前的用戶端日期。 |
16 | 如果緩衝區不夠大,無法容納已轉換的字串值,但只有小數秒,就會發生截斷,並使用 SQLSTATE 01004 和訊息「字串數據,右截斷」產生診斷記錄。 如果緩衝區不夠大,無法容納沒有截斷日期、時間或位移元件的字串值,則會使用 SQLSTATE 22003 和訊息「數值超出範圍」來產生診斷記錄。 請注意,對於 date 和 timestampoffset,無法執行 SQLSTATE 01004,因為轉換字串的最右邊部分不包含小數秒。 因此,任何截斷都會造成數據遺失。 |
17 | 如果緩衝區不夠大而無法容納SQL_SS_TIME2_STRUCT,則會使用 SQLSTATE 22003 和訊息「數值超出範圍」產生診斷記錄。 |
18 | 如果時間不是零,就會使用 SQLSTATE 01S07 和訊息「小數截斷」產生診斷記錄。 |
19 | 如果伺服器類型為 datetime 或 smalldatetime,則值會對應至 TDS 線路格式,而且會是 smalldatetime 的 4 位元節值,而 datetime 則為 8 位元組值。 如果伺服器類型為 datetime2,則會以SQL_TIMESTAMP_STRUCT傳回值。 如果緩衝區不夠大,無法容納傳回的值,就會產生具有SQLSTATE 22003的診斷記錄,以及訊息「數值超出範圍」。 |
20 | 時間會轉換成用戶端時區。 如果此轉換期間發生錯誤,就會產生 SQLSTATE 22008 和訊息「日期時間欄位溢位」的診斷記錄。 |
21 | 如果緩衝區夠大以容納SQL_SS_TIMESTAMPOFFSET_STRUCT,則會以SQL_SS_TIMESTAMPOFFSET_STRUCT傳回值。 否則,診斷記錄會產生 SQLSTATE 22003 和訊息「數值超出範圍」。 |
22 | 值會在擷取日期之前,轉換為用戶端時區。 這提供與 timestampoffset 類型之其他轉換的一致性。 如果此轉換期間發生錯誤,就會產生 SQLSTATE 22008 和訊息「日期時間欄位溢位」的診斷記錄。 這可能會導致日期與簡單截斷所取得的值不同。 |
本主題中的表格描述傳回給客戶端的類型與系結中型別之間的轉換。 針對輸出參數,如果 SQLBindParameter 中指定的伺服器類型不符合伺服器上的實際類型,伺服器將會執行隱含轉換,而傳回給用戶端的類型將會符合透過 SQLBindParameter 指定的類型。 當伺服器的轉換規則與上表所列的轉換規則不同時,這可能會導致非預期的轉換結果。 例如,必須提供預設日期時,SQL Server 會使用 1900-1-1,而不是目前的日期。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應