字符串格式'201708'
如何计算出上月为'201707'

解决方案 »

  1.   

    declare @str varchar(20),@dt datetime
    set @str='201708'
    set @str=left(@str,4)+'-'+substring(@str,5,100)+'-1'
    set @dt=DateAdd(month,-1,@str)
    select replace(convert(varchar(7),@dt,20),'-','')
      

  2.   

    DECLARE @str NVARCHAR(100)='201708'
    SELECT CONVERT(VARCHAR(6),DATEADD(MONTH,-1,CONVERT(DATE,@str+'01')),112)
      

  3.   

    可以用数学的方法
    declare @ym varchar(6)=201707
    select [本月]=@ym,[上个月]=  @ym-1-(1-sign(@ym % 100-1))*88
    set @ym=201701
    select [本月]=@ym,[上个月]= @ym-1-(1-sign(@ym % 100-1))*88
    /*
    本月 上个月
    201707 201706本月 上个月
    201701 201612
    */
      

  4.   

    with t1(dt) as
    (
    select '201712' union all
    select '201711' union all
    select '201707' union all
    select '201704' union all
    select '201701'
    )
    select dt, CONVERT(varchar, convert(int, dt)- case when SUBSTRING(dt, 5, 2)='01' then 89 else 1 end) from t1
      

  5.   

    --SQL Server2012+
    DECLARE @s VARCHAR(20)='201708'
    SELECT Format(EOMONTH(@s+'01',-1),'yyyyMM')
    /*
    (无列名)
    201707
    */
      

  6.   

    format 是个好东西~
      

  7.   

    'EOMONTH'  2008R2识别不了,我在考虑要不要换成12以上的。
      

  8.   

    'EOMONTH'  2008R2识别不了,我在考虑要不要换成12以上的。要换就换 2014 sp2 或 2016 sp1 , 既然要升级, 为什么不用最新的。
    2014  sp2 已经是非常稳定的版本了。http://blog.csdn.net/yenange/article/details/50549937http://blog.csdn.net/yenange/article/details/52980135
      

  9.   

    'EOMONTH'  2008R2识别不了,我在考虑要不要换成12以上的。要换就换 2014 sp2 或 2016 sp1 , 既然要升级, 为什么不用最新的。
    2014  sp2 已经是非常稳定的版本了。http://blog.csdn.net/yenange/article/details/50549937http://blog.csdn.net/yenange/article/details/52980135

    是的,我是想换新的稳定的版本 可以学更多新的特性。
    但是现在项目里面别人都是统一的2008R2,我担心的是到时候会出问题。
    就是之前看到你们在讨论用什么版本的帖子我才产生换的想法的。
    我是个刚入门的菜鸟,接触这方面不到3个月。
      

  10.   

    'EOMONTH'  2008R2识别不了,我在考虑要不要换成12以上的。要换就换 2014 sp2 或 2016 sp1 , 既然要升级, 为什么不用最新的。
    2014  sp2 已经是非常稳定的版本了。http://blog.csdn.net/yenange/article/details/50549937http://blog.csdn.net/yenange/article/details/52980135

    是的,我是想换新的稳定的版本 可以学更多新的特性。
    但是现在项目里面别人都是统一的2008R2,我担心的是到时候会出问题。
    就是之前看到你们在讨论用什么版本的帖子我才产生换的想法的。
    我是个刚入门的菜鸟,接触这方面不到3个月。先学习再说, 你不可能在一个公司呆一辈子吧?
    另外, 你也可以影响其它人来学习高版本, 你告诉人家新版本有足够的诱惑力时, 他们(包括你的上司)自然会升级高版本的了。
    当然, 新版本的好处, 你还得多学习
      

  11.   

    'EOMONTH'  2008R2识别不了,我在考虑要不要换成12以上的。要换就换 2014 sp2 或 2016 sp1 , 既然要升级, 为什么不用最新的。
    2014  sp2 已经是非常稳定的版本了。http://blog.csdn.net/yenange/article/details/50549937http://blog.csdn.net/yenange/article/details/52980135

    是的,我是想换新的稳定的版本 可以学更多新的特性。
    但是现在项目里面别人都是统一的2008R2,我担心的是到时候会出问题。
    就是之前看到你们在讨论用什么版本的帖子我才产生换的想法的。
    我是个刚入门的菜鸟,接触这方面不到3个月。先学习再说, 你不可能在一个公司呆一辈子吧?
    另外, 你也可以影响其它人来学习高版本, 你告诉人家新版本有足够的诱惑力时, 他们(包括你的上司)自然会升级高版本的了。
    当然, 新版本的好处, 你还得多学习
    要得 版主大大!
      

  12.   


    select * into #Table
    from(select '201712' a union all
    select '201711' a union all
    select '201707' a union all
    select '201704' a union all
    select '201701' ) Tselect * from #Tableselect  cast(a+'01' as datetime) from #Tableselect replace( convert(varchar(7), dateadd(day, -1,cast(a+'01' as datetime)),121),'-','') from #Tabledrop table #Table
      

  13.   

    2005
    declare @as_date varchar(6)
    SET @as_date='201708'
    select convert(varchar(6),dateadd(mm,-1,@as_date+'01'),112)