【问题标题】:Issue with DateDiff function in SQL ServerSQL Server 中的 DateDiff 函数问题
【发布时间】:2014-12-03 04:51:59
【问题描述】:

我在查找月份中的确切日期差异时遇到了问题。

我的要求是这样的

 difference in months between two dates in 2015-01-25 00:00:00.000 and  2015-04-25 00:00:00.000   should be 3 

 difference in months between two dates 2015-01-25 00:00:00.000 and  2015-04-26 00:00:00.000   should be > 3 


   SELECT DATEDIFF(MONTH, '2015-01-25 00:00:00.000', '2015-04-28 00:00:00.000')

如果你使用 DATEDIFF 函数,那么上面两个例子都会返回相同的值 3。 即 SELECT DATEDIFF(MONTH, '2015-01-25 00:00:00.000', '2015-04-26 00:00: 00.000') 是 3。但我需要大于 3 的结果

如何使用单个选择查询来实现上述要求。

【问题讨论】:

  • DATEDIFF(MONTH, '2015-01-25 00:00:00.000', '2015-04-26 00:00:00.000')时的期望值是多少?你想要3.xx吗?
  • 是的..我需要这样的输出
  • @ekad ..即使返回值为 4 我也没问题
  • 由于月份长度可变,当您尝试以月份为单位进行计算时,您总是会得到一些不直观的结果(对您而言,无论您目前正在做什么)。特别考虑月末的日期,您可能会得到两个相隔 30 天的日期的两次比较,根据所涉及的月份,您可能会得到“1 个月,1 天”,“2 个月正好”这样的结果”和“2个月零1天”。
  • 我知道这是旧的,但我把它放在那里,因为我会很高兴自己看到这个。我有一个类似但略有不同的问题,年数(2017 年与 2020 年)上升为 3 - 尽管 2017 年的月份更晚。因此,2017 年 12 月与 2020 年 3 月相差 3 年,如果您计算年数,我认为这在技术上是正确的(但实际上我们通常试图计算已经过去了多少时间,而 3 年实际上并没有过去...... )(续)

标签: sql .net sql-server database


【解决方案1】:

您需要计算月份,然后您需要将开始日期提前几个月并计算天数,如下所示:

SQL Fiddle

MS SQL Server 2008 架构设置

查询 1

declare @f datetime, @t datetime
select @f='2015-01-25 00:00:00.000', @t='2015-04-28 00:00:00.000'
SELECT DATEDIFF(MONTH, @f, @t) as m, 
datediff(d, dateadd(month, DATEDIFF(MONTH, @f, @t), @f), @t) as d,
DATEDIFF(MONTH, @f, @t) + convert(float, datediff(d, dateadd(month, DATEDIFF(MONTH, @f, @t), @f), @t)) / 30.0 as md

Results

| M | D |  MD |
|---|---|-----|
| 3 | 3 | 3.1 |

【讨论】:

    【解决方案2】:
    declare @s datetime, @e datetime
    select @s='2015-01-25 00:00:00.000', @e='2015-04-28 00:00:00.000'
     SELECT ceiling(cast(cast(DATEDIFF(MONTH, @s,@e) as varchar)+'.'+cast(-(DATEPART(dd,@s)-DATEPART(dd, @e)) as varchar) as float)) as Month
    

    结果

    Month
     4
    

    【讨论】:

      【解决方案3】:

      The perfect solution to find the actual Months between two dates is as below:

      CREATE FUNCTION FullMonthsSeparation 
      (
          @DateA DATETIME,
          @DateB DATETIME
      )
      RETURNS INT
      AS
      BEGIN
          DECLARE @Result INT
      
          DECLARE @DateX DATETIME
          DECLARE @DateY DATETIME
      
          IF(@DateA < @DateB)
          BEGIN
              SET @DateX = @DateA
              SET @DateY = @DateB
          END
          ELSE
          BEGIN
              SET @DateX = @DateB
              SET @DateY = @DateA
          END
      
          SET @Result = (
                          SELECT 
                          CASE 
                              WHEN DATEPART(DAY, @DateX) > DATEPART(DAY, @DateY)
                              THEN DATEDIFF(MONTH, @DateX, @DateY) - 1
                              ELSE DATEDIFF(MONTH, @DateX, @DateY)
                          END
                          )
      
          RETURN @Result
      END
      GO````
      
      
      `-- AS eaxmple 
      declare @a datetime = getdate()
      declare @b datetime = getdate()-59
      
      --less than 60 days i.e. 1 months
      select dbo.FullMonthsSeparation (@a,@b) AS Months
      
      SET @a = getdate()
      SET @b = getdate()-61
      
      --More than 60 days i.e. 2 months
      select dbo.FullMonthsSeparation (@a,@b) AS Months`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多