Sql-Server-2012

轉換函式

  • June 23, 2016

我正在轉換一些日期以使它們更易於閱讀,當我呼叫轉換函式時,它們根本不轉換。當我執行查詢時,它們看起來是一樣的。程式碼非常簡單和簡短,所以理論上我認為沒有什麼可以阻止它。我可以使用 datename 函式,它可以工作,但不能轉換。轉換函式沒有按應有的方式工作的任何原因?這是程式碼:

SELECT borrower#,
   location,
   expiration_date,
   last_authentication_date,
   last_cko_date,
   CONVERT(CHAR(8), last_cko_date, 103)
FROM
   borrower

last_cko_date 是一個小整數。目前顯示的格式是:16911。我想要的格式是 mm/dd/yyyy

為了解決直接的問題:

轉換函式沒有按應有的方式工作的任何原因?

CONVERT 函式適用於各種類型。應用哪種類型的轉換主要取決於第一個參數(顯式)和第二個參數(隱式作為表達式的類型)指定的類型。第三個參數的存在並不自動意味著表達式,第二個參數,應該被視為日期時間參數,因為還有其他轉換算法允許您將樣式指定為 CONVERT 的第三個參數 - 不僅僅是字元串之間的那些和日期/時間/日期時間。

因此,由於last_cko_date是數字 (a smallint) 並且目標類型是字元串(char(8)具體而言),因此在數字和字元串之間進行轉換,而不是在日期和字元串之間進行轉換,即使您指定了 103,這是一種樣式用於日期和時間與字元串之間的轉換。

因此,為了解決從整數中獲取日期格式字元串的問題,您首先需要將數字表示為日期或日期時間值。16911 的值在我看來就像從 1970 年 1 月 1 日開始的偏移量,以天為單位,所以,假設這是你首先可以做的:

DATEADD(DAY, last_cko_date, '19700101')

這將為您提供與 integer 相對應的 datetime 值last_cko_date。在 CONVERT 函式中使用該表達式以所需樣式返回日期:

CONVERT(char(10), DATEADD(DAY, last_cko_date, '19700101'), 103)

或者,因為您實際上想要mm/dd/yyyy

CONVERT(char(10), DATEADD(DAY, last_cko_date, '19700101'), 101)

另請注意,char(10)而不是char(8)。上述兩種樣式都返回一個 10 個字元的字元串。正如tpet正確注意到的那樣,將其截斷為 8 將刪除年份的最後一位。

然而,一個可能更好的主意是首先省略 SQL 中的轉換。將日期原樣返回給客戶端,並讓它完成以所需格式呈現數據的工作。

除非您使用 SSMS 僅顯示日期,否則您的表示層應處理以您想要顯示的任何格式顯示日期的部分。

我通常使用日期格式幫助來找出樣式:-)

SELECT [borrower#], -- use square brackets when you have special characters in the output column name
   location,
   expiration_date,
   last_authentication_date,
   last_cko_date,
   CONVERT(VARCHAR(10), last_cko_date, 101) as last_cko_date_Formatted-- display as MM/DD/YYYY
FROM
   schema.borrower  -- always use schema.TableName

引用自:https://dba.stackexchange.com/questions/141866