【问题标题】:Concatenate in SQL Server 2008 R2 failing when the monthid is 2 digits当月标识为 2 位时,SQL Server 2008 R2 中的连接失败
【发布时间】:2018-05-01 23:39:37
【问题描述】:

我有一个类似的表,服务器是 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 位时,表示失败。

如何应对这种情况?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008-r2 concatenation


    【解决方案1】:

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

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

    test here

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:
          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
          

          【讨论】:

            最近更新 更多