簡體   English   中英

如何在 SQL 服務器中將 nvarchar 日期從一列轉換為另一列

[英]How to convert nvarchar to date from one column to another in SQL Server

我有一個名為“Month Year Raw”的列,其中包含多個 nvarchar 類型的數據,如下所示:202201,我想將其轉換為名為“Month Year”的列,類似於“January 2022”。

這真是個壞消息。 根本不應該將日期存儲為字符串,更不用說多次(這只是多余的存儲而沒有任何好處)。 甚至nvarchar也不好; 為什么你需要使用 Unicode 個字符來表示yyyyMM 我知道 2020 年很糟糕,但您仍然不能使用 4 個便便表情符號 ( 03 )。

將日期存儲為適當的日期/時間數據類型,然后您將獲得內置驗證、可搜索查詢、日期數學等。您始終可以在顯示時間派生出這些顯示格式。

負責任地約會中還有很多其他建議。

直到你能解決這個問題:

UPDATE dbo.BadIdeas 
SET [Month Year] = CONCAT
  (
    DATENAME(MONTH, CONVERT(datetime, 
       [Month Year Raw] + '01', 112)),
    ' ', 
    YEAR(CONVERT(datetime, 
       [Month Year Raw] + '01', 112))
  );

如果您只是想知道編程的可能性 - “202201”將采用LEFT(4)字符作為年份, RIGHT(2)個字符作為月份。 假設您收到了那個非原子 nvarchar 字符串,並且只需要一個一次性的臨時查詢。

您不會向表中添加新列,只是 select 需要 output。有一個名為 DATENAME DATENAME()的內置 SQL 服務器 function 可將數字轉換為月份名稱。 由於數據存儲在 nvarchar 中,您需要轉換為兼容的 integer 才能使用這些函數,因此我將使用CAST()

DECLARE @variable nvarchar(100) = '202201'

SELECT DATENAME(MONTH, CAST(RIGHT(@variable, 2) as int)) + ' ' + LEFT(@variable, 4) AS [Answer]

output 中的結果:

2022 年 1 月


我要指出的幾件事:

  1. nvarchar 每個字符占用 2 個字節的存儲空間,外加 2 個字節的變量開銷。 “202201”總共花費 14 個字節。 或者,datetime 僅花費 8 字節的總存儲空間。
  2. datetime 數據類型是唯一設計用於 SQL 服務器內置函數的數據類型,這就是為什么您被告知以正確的數據類型存儲日期。
  3. 將月份和年份組合到同一個自定義字符串中違反了 1NF,因為數據不是原子的。 當您擁有非原子數據時,您最終不得不使用LEFT()RIGHT()等提取部分字符串。如果您需要使用系統函數,則必須使用CAST()轉換非原子數據。

改為使用日期時間數據類型的示例:

DECLARE @variable2 datetime = '2022-01-01'
SELECT FORMAT (@variable2, 'MMMM yyyy')

還導致:

2022 年 1 月

使用正確的數據類型可以縮短代碼,並且不需要提取或轉換數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM