获取两个日期之间的实际月份差异

时间:2014-01-16 08:58:42

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我在SQL中处理奇怪的查询,我想找到两个日期之间的实际月份差异,例如

StartDate = '1-1-2013'
EndDate = '4-30-2013'

这里我希望结果为4而不是3

select datediff(mm, '1-1-2013', '4-30-2013') 

此查询将为我提供结果3,但实际结果为4.有人可以帮我吗?

4 个答案:

答案 0 :(得分:1)

不太确定这是否有所帮助,但我在这里捅了一下:

declare
    @date1 datetime = '2013-01-01',
    @date2 datetime = '2013-04-30'

select Cast(Round(Cast(DATEDIFF(DD,@date1, @date2) as decimal(5,2)) / 30, 1) as int)   as  Months

答案 1 :(得分:0)

请尝试添加01-01-2013和04-30-2013而不是您在此处添加的内容

所以查询将如下

select datediff(mm, '1-1-2013', '4-30-2013') 

由于 Vasanthan

答案 2 :(得分:0)

你要问的并不像第一次出现那么简单。一个显而易见的方法是在做日期之前将一天添加到结束日期。这将是1月1日至5月1日,将报告为四个月。

但是你需要考虑是否存在任何公差;例如,1月1日至4月29日应该被视为四个月,还是三个月?显然,这在很大程度上取决于您使用这些日期的背景。

答案 3 :(得分:0)

正如其他人所指出的,结果是完全正确的:3个月和29天。

您当然可以检查结束日期中的日期是否是该月的最后一个日期,并进行调整以产生所需的结果:

DECLARE @START DATETIME, @END DATETIME
SELECT @START = '2014-01-01', @END = '2014-04-30'

SELECT @START, @END

SELECT DATEDIFF(MONTH, @START, CASE WHEN MONTH(DATEADD(DAY, 1, @END)) > MONTH(@END) THEN DATEADD(DAY, +1, @END) ELSE @END END)

不确定所述示例的性能(您可以自由尝试类似的想法),但它的作用是添加最后一个缺失日,以便在结束日期代表该月的最后一天时产生4个月的差异

现在,我同意其他人的说法,这是一件很奇怪的事情,但如果你的情况需要这样,那就这样吧。我们无法在此处评论您的业务/编程特定需求。 :)