当 monthid 为 2 位数字时,在 SQL Server 2008 R2 中连接失败

Concatenate in SQL Server 2008 R2 failing when the monthid is 2 digits

我有一个 table 喜欢和服务器是 SQL Server 2008 R2 我们不能使用 concat 功能

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位时,失败

如何处理这种情况?

首先,您可以通过 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
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

您可以简单地这样做:

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

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

最简单的方法是(恕我直言):

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

test here