【问题标题】:How to get month (in string) diff in sql server如何在sql server中获取月份(字符串)差异
【发布时间】:2018-10-16 22:41:02
【问题描述】:

如何根据字符串中的月份名称(一月、二月、三月等)将月份差异作为整数?

比如我有一个变量declare @month varchar(20) = 'May'; 和 Select DATEDIFF(month, month(getdate()), @month) 应该是 7( 10 月和 5 月之间的差异)。

【问题讨论】:

  • 10 月和 5 月 b/w 的差异应该是 7 还是 5??
  • 您好,大连,您需要它们之间的差异还是需要整数月份
  • 或者据我了解您的问题,您需要两个月之间的差异,结果为整数?
  • 我的意思是 7(向后)。 2019 年 5 月 - 2018 年 10 月 = 7。
  • @Birel 是的。我需要整数作为结果。

标签: sql sql-server


【解决方案1】:

在 SQL Server 中,您将使用 datediff():

select datediff(month, '2010-01-15', '2011-02-28')

这会计算两个日期之间的月份边界数。这听起来像是对您问题的合理解释。

【讨论】:

  • 月份名称在字符串中。
【解决方案2】:
Declare @M1 varchar(25) = 'October'
Declare @M2 varchar(25) = 'May'

Select DateDiff(MONTH,@M1+' 01 1980',@M2+' 01 1980')
       +case when DateDiff(MONTH,@M1+' 01 1980',@M2+' 01 1980')<0 then 12 else 0 end

返回 7

【讨论】:

    【解决方案3】:
    DECLARE @M1 as varchar(20) = 'October';
    DECLARE @M2 as varchar(20) = 'May';
    
    SELECT ABS(datediff(mm,
                        convert(datetime, @M1 + ' 1 2012 11:01AM', 100),
                        convert(datetime, @M2 + ' 1 2012 11:01AM', 100) 
                        )
            );
    

    这不允许多年,这是你之前没有提到的

    【讨论】:

      【解决方案4】:

      假设输入1,输入2,你去:

      declare @input1 nvarchar(max)='October'
      declare @input2 nvarchar(max)='May'
      
      select 
          case 
              when DATEPART(MM,@input1+' 01 2011')>DATEPART(MM,@input2+' 01 2011') 
                  then 12 
              else 0
          end-DATEPART(MM,@input1+' 01 2011')+DATEPART(MM,@input2+' 01 2011')
      

      【讨论】:

      • @大连,我想乔治给了你想要的答案。
      • 这很奇怪,网站的解析器忽略了END?
      【解决方案5】:

      试试这个

      select  DATEPART(MM,'march 01 2011') - DATEPART(MM,'january 01 2011')
      

      【讨论】:

        【解决方案6】:

        不确定你想做什么,但这样的事情可能会奏效:

        select MONTH(STR_TO_DATE('October', '%M')) - MONTH(STR_TO_DATE('May', '%M')) -- returns 5
        

        【讨论】:

          【解决方案7】:

          试试这个

          DECLARE @Date1 VARCHAR(10),@Date2  VARCHAR(10)
          SET @Date1='January'
          SET @Date2='DECEMBER'
          ;WITH CTE
          AS
          (
          SELECT Number AS EnglishMOnthNumber,
                  DATENAME(MONTH,DATEADD(MONTH,NUMBER-DATEPART(MONTH,GETDATE()),GETDATE())) AS EnglishMOnth
          FROM master.dbo.spt_values
          WHERE NUmber Between 1 and 12
          AND type='P'
          )
          SELECT MAX(CASE WHEN EnglishMOnth=@Date2 THEN EnglishMOnthNumber END) 
                - MAX( CASE WHEN EnglishMOnth=@Date1 THEN EnglishMOnthNumber END ) AS DiffInMonths
          FROM CTE
          

          【讨论】:

            【解决方案8】:

            我会得到所需月份(在你的情况下是 5 月)和当前月份之间的差值,如果差值小于 0,那么我会添加月数 (12) 以得到计算,否则什么都不会添加。这只是上面更好的答案的另一种方式

            declare @RequiredMonth varchar(25) = 'February';
            declare @difference as int;
            
            set @difference = MONTH(cast(@RequiredMonth+'1 2016' as datetime)) - MONTH(getdate())
            
            select case when  @difference >= 0 then  @difference else @difference + 12 end
            

            【讨论】:

              【解决方案9】:

              你可以使用这样的东西:

              DECLARE
                  @month varchar(20) = 'May'
              
              SELECT DATEDIFF(MONTH, GETDATE(), EndDate)
              FROM (SELECT CAST(@month  + CAST( YEAR(GETDATE()) + 1 AS VARCHAR(4))  AS DATE) EndDate) D
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-04-07
                • 2012-08-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多