適用於:
SQL Server
Azure SQL Database
Azure SQL 受控執行個體
Azure Synapse Analytics
Analytics Platform System (PDW)
本主題列出從 C 類型轉換成 SQL Server 日期/時間類型時應考慮的問題。
下表所述的轉換適用于用戶端上所做的轉換。 如果用戶端為與伺服器上定義的參數指定小數秒精確度,用戶端轉換可能會成功,但當呼叫 SQLExecute 或
SQLExecuteDirect
時
,伺服器會傳回錯誤。 特別是,ODBC 會將小數秒的任何截斷視為錯誤,而 SQL Server 行為則是四捨五入;例如,當您從
datetime2(6)
到
datetime2(2)
時,就會發生四捨五入。 Datetime 資料行值會四捨五入為秒的 1/300,而 Smalldatetime 資料行的秒數則由伺服器設定為零。
-
:不支援轉換。 診斷記錄會產生 SQLSTATE 07006 和訊息「限制資料類型屬性違規」。
1
:如果提供的資料無效,就會使用 SQLSTATE 22007 和訊息「不正確日期時間格式」產生診斷記錄。
2
:時間欄位必須是零,或是 SQLSTATE 22008 和訊息「小數截斷」所產生的診斷記錄。
3
:小數秒必須是零,或是使用 SQLSTATE 22008 和「小數截斷」訊息產生診斷記錄。
4
:忽略日期元件。
5
:時區設定為用戶端的時區設定。
6
:時間設定為零。
7
:日期設定為目前的日期。
8
:時間會從用戶端的時區轉換成 UTC。 如果此轉換期間發生錯誤,就會產生 SQLSTATE 22008 和訊息「日期時間欄位溢位」的診斷記錄。
9
:字串會根據遇到的第一個標點符號字元以及剩餘元件的存在,剖析並轉換成 date、datetime、datetimeoffset 或時間值。 接著,字串會轉換成目標型別,並遵循上表中此程式所探索來源類型的規則。 如果在剖析資料時偵測到錯誤,則會使用 SQLSTATE 22018 和訊息「轉換規格的字元值無效」產生診斷記錄。 對於 datetime 和 Smalldatetime 參數,如果年份超出這些類型所支援的範圍,則會使用 SQLSTATE 22007 和訊息「不正確日期時間格式」產生診斷記錄。
對於 datetimeoffset,即使沒有要求轉換為 UTC,此值在轉換到 UTC 之後仍然必須在範圍內。 這是因為 TDS 和伺服器永遠會以 UTC 的 datetimeoffset 值,將時間正規化,因此用戶端必須在轉換成 UTC 之後,確認時間元件位於支援的範圍內。 如果值不在支援的 UTC 範圍內,則會使用 SQLSTATE 22007 和訊息「不正確日期時間格式」產生診斷記錄。
10
:如果發生資料遺失的截斷,就會使用 SQLSTATE 22008 和訊息「不正確時間格式」產生診斷記錄。 如果此值落在伺服器使用之 UTC 範圍所代表的範圍外,也可能發生這個錯誤。
11
:如果資料的位元組長度不等於 SQL 類型所需的結構大小,就會產生具有 SQLSTATE 22003 的診斷記錄,以及「超出範圍的數值」訊息。
12
:如果資料的位元組長度是 4 或 8,資料會以原始 TDS Smalldatetime 或 datetime 格式傳送至伺服器。 如果資料的位元組長度完全符合SQL_TIMESTAMP_STRUCT的大小,則資料會轉換成 datetime2 的 TDS 格式。
13
:如果發生資料遺失的截斷,則會使用 SQLSTATE 22001 和訊息「字串資料,右截斷」產生診斷記錄。
小數秒位數(小數位數)取決於目的地資料行的大小,如下表所示:
不過,針對 SQL_C_TYPE_TIMESTAMP,如果小數秒可以以三位數表示,而不會遺失資料,且資料行大小為 23 或更大,則會產生確切的三個小數秒位數。 此行為可確保使用舊版 ODBC 驅動程式所開發之應用程式的回溯相容性。
對於大於資料表中範圍的資料行大小,會隱含小數位數 9。 此轉換應該允許最多九個小數秒位數,這是 ODBC 所允許的最大值。
零的資料行大小表示 ODBC 中可變長度字元類型的無限制大小(除非套用SQL_C_TYPE_TIMESTAMP的 3 位數規則)。 使用固定長度字元類型指定零的資料行大小是錯誤。
N/A
:維護現有的 SQL Server 2005 (9.x) 和更早的行為。
日期和時間改善 (ODBC)
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:
https://aka.ms/ContentUserFeedback
。
提交並檢視相關的意見反應