轉換函式
我正在轉換一些日期以使它們更易於閱讀,當我呼叫轉換函式時,它們根本不轉換。當我執行查詢時,它們看起來是一樣的。程式碼非常簡單和簡短,所以理論上我認為沒有什麼可以阻止它。我可以使用 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
是數字 (asmallint
) 並且目標類型是字元串(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