2016-06-22 42 views
35

我有一段時間201604(nvarchar)。有沒有一種方法可以將201604轉換爲APR16將YYYYMM轉換爲MMMYY

+3

你或許應該添加要使用到的問題的SQL Server版本 - 下面添的回答假設2012或更高版本。 – Bridge

+0

@TimBiegeleisen'CONCAT'是2012年添加的問題。你當然可以使用'+'來連接字符串。我沒有挖,就像答案開始涌入,我想我們應該得到OP澄清:) – Bridge

+3

反向鏈接http://codegolf.stackexchange.com/questions/83591/convert-yyyymm-to-mmmyy – Criggie

回答

45

使用DATENAME & SUBSTRING功能,像這樣:

declare @str nvarchar(50) = '201604' 

select UPPER(left(datename(mm,cast(@str+'01' as date)),3))+substring(@str,3,2) --APR16 
17

這有點難看,但你不能使用任何內置日期格式的東西。隨意換出,如果你有一個月份名稱表的連接case語句等:

DECLARE @exampleVal NVARCHAR(6) = '201604'; 

SELECT CASE SUBSTRING(@exampleVal, 5, 2) 
     WHEN '01' THEN 'JAN' 
     WHEN '02' THEN 'FEB' 
     WHEN '03' THEN 'MAR' 
     WHEN '04' THEN 'APR' 
     WHEN '05' THEN 'MAY' 
     WHEN '06' THEN 'JUN' 
     WHEN '07' THEN 'JUL' 
     WHEN '08' THEN 'AUG' 
     WHEN '09' THEN 'SEP' 
     WHEN '10' THEN 'OCT' 
     WHEN '11' THEN 'NOV' 
     WHEN '12' THEN 'DEC' 
     END + 
     SUBSTRING(@exampleVal, 3, 2) 
+0

這個答案對眼睛來說是最簡單的,如果放在用戶定義的函數中會更好。 –

+4

@Thomas好吧,也許這種方式實際上更好。我的意思是,哪個人希望看到「APR16」而不是「2016年4月」?因此,最有可能的是,實際採用此功能的結果不關心區域/語言設置。 – dim

+3

@Thomas我知道 - 但問題中指定的是哪裏? – Bridge

7

試試這個:

添加「01」(如每月的第一天),所以轉換您VARCHAR到DATETIME並獲得一個月的DATENAME:

declare @myperiod nvarchar(10) 
SET @myperiod = '201604' 

SET @myperiod = @myperiod + '01' 

SELECT UPPER(SUBSTRING(DATENAME(month, CONVERT(datetime, @myperiod)), 1, 3)) + 
    SUBSTRING(CONVERT(varchar, DATEPART(year, CONVERT(datetime, @myperiod))), 3, 4) 
+0

它顯示完整的月份名稱。 – Whencesoever

+0

對,現在修復它 –

+0

+ UPPER,並會好 – Whencesoever

6

在兩行:

declare @napis varchar(6)='201506' 
SELECT UPPER(LEFT(DATENAME(month, @napis+'01'),3)) + SubString(@napis,3,2) 
+0

那種感覺,當你給予絕對正確的答案,但學分去另一個。 – gofr1

5

使用簡單此

declare @test nvarchar(max) = '201604' 

select left(DATENAME(month, @test +'01'),3) + SubString(@napis,3,2) 
+0

你的方法給了'2016年4月'。這是錯誤的 – Whencesoever

4

另一種方式:

DECLARE @Date varchar(6) = '201604' 

SELECT REPLACE(SUBSTRING(CONVERT(char(9), CAST(@Date +'01' as Date), 6), 4, 7), ' ', '') 
4

試試這個..

DECLARE @DATE NVARCHAR(6) = '201604' 
SELECT datename(MONTH,CONVERT(DATE,CONVERT(DATE,LEFT(@DATE,4)+'.'+RIGHT(@DATE,2)+'.01',102),102)) 
7

添加01處最後一個,以便它更改爲有效的日期格式。然後使用DATENAME函數:

DECLARE @STRING VARCHAR(10)='201604' 

SELECT DATENAME(MONTH,@STRING+'01') +' '+SUBSTRING(@STRING,3,2) 

輸出:

April 16 
+1

只需添加上和左'選擇上(左(DATENAME(月,@ STRING + '01'),3))+ SUBSTRING(@ STRING,3,2)'和珍貴的OP請求:) – gofr1

6

另一種選擇是通過使用Format()DateFromParts()。這將在SQL Server 2012或更新版本的工作:

Declare @Period NVarchar (6) = N'201604' 
Declare @Format NVarchar (5) = N'MMMyy' 

Select Upper(Format(DateFromParts(Left(@Period, 4), Right(@Period, 2), 1), @Format)) 

APR16

相關問題