datetime 資料類型從 SQL 轉換成 C

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics 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,而不是目前的日期。

另請參閱

日期和時間改善 (ODBC)