2017-11-18 405 views
1

我有一个表像和服务器是SQL Server 2008 R2中,我们不能使用concat功能串接在SQL Server 2008 R2失败时monthid是2个位数

YearID | MonthId  
--------+---------- 
2017 | 1 
2014 | 5 
2014 | 10 
2016 | 12 

我想有输出

201701 
201405 
201410 
201612 

我试了一下,到目前为止

select 
    cast(YearId as varchar(50)) + '0' + cast(MonthId as varchar(50)) 
from 
    TEST 

我得到的输出作为

201701  
201405 
2014010 
2016012 

monthID是2位数字时,它失败。

如何解决这种情况?

回答

2

首先,你可以通过LEN()功能与简单case表达验证MonthId长度

SELECT CAST(YearID AS VARCHAR(8))+CASE 
             WHEN LEN(CAST(MonthId AS VARCHAR(8))) = 2 
             THEN CAST(MonthId AS VARCHAR(8)) 
             ELSE '0'+CAST(MonthId AS VARCHAR(8)) 
            END 
FROM <table_name>; 

结果:

201701 
201405 
201410 
201612 
0
DECLARE @Tmp TABLE (YearID INT ,MOnthId INT) 
INSERT INTO @Tmp 
SELECT 2017 ,1 UNION ALL 
SELECT 2014 ,5 UNION ALL 
SELECT 2014 ,10 UNION ALL 
SELECT 2016 ,12 

SELECT * FROM @Tmp 

SELECT 
CASE WHEN LEN(MOnthId)>1 THEN CAST(YearId AS VARCHAR(50)) + CAST(MonthId AS VARCHAR(50)) 
    ELSE CAST(YearId AS VARCHAR(50)) + '0' + CAST(MonthId AS VARCHAR(50))END 
FROM @Tmp 

Results : 
201701 
201405 
201410 
201612 
6

你可以简单地这样做:

SELECT CAST(YearID * 100 + MonthID AS VARCHAR(6)) 
FROM mytable 

请注意,我们在这里只使用一个强制操作并仅使用算术操作。没有使用额外的检查和功能。

1

最简单的方法是(IMHO):

SELECT CONVERT(VARCHAR(4), YearID) + RIGHT('0' + CONVERT(VARCHAR(2), MOnthId), 2) 
FROM TEST; 

test here