计数与SQL SERVER的最新日期不同的月份

计数与SQL SERVER的最新日期不同的月份,sql,sql-server,datediff,Sql,Sql Server,Datediff,我在使用sql server查询计算从2个日期算起的月份差异时遇到问题 我尝试使用DATEDIFF(月、SD、ED) 比如这个 SD = '2013-12-10 00:00:00.000' ED = '2014-12-09 00:00:00.000' SELECT DATEDIFF(MONTH, SD, ED) --result : 12 //this correct result SD = '2013-12-10 00:00:00.000' ED = '2014-12-10 00:00:

我在使用sql server查询计算从2个日期算起的月份差异时遇到问题

我尝试使用
DATEDIFF(月、SD、ED)

比如这个

SD = '2013-12-10 00:00:00.000'
ED = '2014-12-09 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this correct result


SD = '2013-12-10 00:00:00.000'
ED = '2014-12-10 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this incorrect result, the result that i want is 13


SD = '2013-12-10 00:00:00.000'
ED = '2014-12-15 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 12 //this incorrect result, the result that i want is 13

SD = '2013-12-01 00:00:00.000'
ED = '2014-11-30 00:00:00.000'
SELECT DATEDIFF(MONTH, SD, ED)

--result : 11//this incorrect result, the result that i want is 12
有什么解决办法可以得到2日月差的正确结果?? 有人能帮我吗


谢谢

DATEDIFF
只比较月份,而不考虑其中的日期。由于您希望包含部分月份,请尝试同时比较日期,并在DATEPART(day,@d2)>=DATEPART(day,@d1)时添加
大小写,然后添加1或0结束

因此,要使用问题中的符号:

SELECT DATEDIFF(MONTH, SD, ED) +
    CASE WHEN DATEPART(DAY, ED) >= DATEPART(DAY, SD) THEN 1 ELSE 0 END
DATEDIFF()
的工作原理与许多人预期的不同。从:

返回指定的开始日期和结束日期之间交叉的指定日期部分边界的计数(有符号整数)

DATEDIFF(月、@startdate、@enddate)
相当于

(YEAR(@enddate) - YEAR(@startdate)) * 12 + (MONTH(@enddate) - MONTH(@startdate)). 
因此对于
2013-12-01
2014-11-30
,其
(2014-2013)*12+(11-12)

实际上是11。对于
'2013-12-31'
'2014-11-01'
来说,它也是11。再次强调,这种方式是因为它是唯一一种文化中立和完全一致的方式


您需要定义应用程序中的“正确”是什么,然后编写查询。如果您需要重复使用逻辑,建议使用用户定义的函数。

定义您对任意两个给定日期的“正确结果”的看法。Datediff看起来是错误的解决方案,但如果您将一个月添加到ED,然后减去一天(或可能相反),则可能会奏效。如果你描述一下你想数到什么,你可能会得到更好的答案。这些例子令人困惑,不够精确,无法给出准确的答案。同样的事情我在编辑中指定,但他给出了一些其他的例子,并说它给出的不正确result@RobFarley不,这很愚蠢。正如在理解用户想要什么方面缺乏任何智能一样,根据我的经验,用户真正想要的绝不是
DATEDIFF()
实际做的事情,但它是执行此操作的唯一默认函数。因此:它总是非直觉的。它之所以这样做是有充分理由的(一个能满足所有用户需求的函数太复杂了),但这使得它非常有限(或者,就像我说的:愚蠢)。这不是预制结构。这只是一个工具,你可以用来建立自己。这在SQL中实际上有点不寻常。