我在SQL中处理奇怪的查询,我想找到两个日期之间的实际月份差异,例如
StartDate = '1-1-2013'
EndDate = '4-30-2013'
这里我希望结果为4而不是3
select datediff(mm, '1-1-2013', '4-30-2013')
此查询将为我提供结果3,但实际结果为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个月的差异
现在,我同意其他人的说法,这是一件很奇怪的事情,但如果你的情况需要这样,那就这样吧。我们无法在此处评论您的业务/编程特定需求。 :)