【问题标题】:Calculate month from two dates in sql server从sql server中的两个日期计算月份
【发布时间】:2014-04-03 11:47:26
【问题描述】:

计算两个日期的月差

它与 dateDiff(m, datestart , dateend ) 一起工作正常,但我有基于 day.like 计算月份的场景。如果 01/01/2012 到 20/01/2012 必须显示为 1 个月的结果。

另一种情况是 02/01/2012 到 03/02/102 必须显示为 2 个月的结果。

我该怎么做。

【问题讨论】:

  • 用作dateDiff(d, datestart , dateend )/30
  • @AmitAgrawal:我认为它仍然会带来 0
  • @huMptyduMpty 如果月份小于 1
  • @AmitAgrawal:在这种情况下会发生什么Select dateDiff(d, '1/30/2012' , '2/1/2012' )/30 OP 期望看到 2 作为结果!!
  • @huMptyduMpty 相差不是2个月

标签: sql-server


【解决方案1】:

试试这个,

Declare @sDate date = '1/15/2014'
Declare @eDate date = '3/10/2014'

Select DATEDIFF(mm,@sDate,@eDate) - Case When datepart(DD,@sDate) > DATEPART(dd,@eDate) Then  1 else 0 end

SQL 小提琴DEMO

【讨论】:

    【解决方案2】:

    这个怎么样,

    SELECT CASE
    WHEN
    DATEPART(MONTH,'STARTDATE') = DATEPART (MONTH,'ENDDATE')
    THEN
    DATEPART(MONTH,'STARTDATE')
    ELSE
    DATEDIFF(MONTH,'STARTDATE','ENDDATE') 
    END
    AS 'MONTH-DIFFERENCE' 
    FROM TABLE_NAME
    

    【讨论】:

      【解决方案3】:

      我解决了。 SELECT
      BadgeNo AS [Badge No], JB.GHRSBadgeNo AS [GHRS No],
      (ISNULL(Emp.FirstName,'') + ' ' + ISNULL(Emp.MiddleName,'') + ' '+ ISNULL(Emp.LastName,'')) AS [Name],
      JB.Department AS [Department],
      JB.ServiceCompany AS [Service Company],
      REPLACE(CONVERT(VARCHAR(11), Emp.BirthDate, 106), ' ', '-') AS [Birth Date]
      FROM
      Employee AS Emp
      LEFT JOIN
      jobdata AS JB
      ON
      EMP.BadgeNo = JB.BadgeNo
      WHERE
      1 = (FLOOR(DATEDIFF(dd,EMP.BirthDate,DATEADD(month, 1,GETDATE())) / 365.25)) - (FLOOR(DATEDIFF(dd,EMP.BirthDate,GETDATE()) / 365.25))

      【讨论】:

        【解决方案4】:

        使用相同的函数并将结果加 1 例如

        (dateDiff(m, datestart , dateend )+1) as Month
        

        【讨论】:

        • 这个场景对于普通月份的计算会出错
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多