2011-09-13 14 views
5

我在SQL中写了一个小查询,并且碰到一个问题,它似乎是某个人必须碰到的问题。我正在尝试查找两个日期之间的月数。我使用的表达式如...在SQL中与Drateiff作战

DATEDIFF(m,{firstdate},{seconddate}) 

但是我注意到这个函数计算日期跨越每月阈值的时间。在示例...

DATEDIFF(m,3/31/2011,4/1/2011) will yield 1 
DATEDIFF(m,4/1/2011,4/30/2011) will yield 0 
DATEDIFF(m,3/1/2011,4/30/2011) will yield 1 

有谁知道如何找到更因此基于两个日期之间的几个月后时间的推移,然后次了每月门槛?

+1

有趣的是,我从来没有注意到它是这样做的 – user937146

+1

一个月中有多少天?你想给出日期对(2011-03-15,2011-04-14),(2011-03-15,2011-04-15),(2011-03-15,2011-04-16),(2011) -01-28,2011-02-2 8),(2011-01-28,2011-03-01),(2012-01-29,2012-02-28),(2012-01-29,2012-02-29),(2012-01- (2012-01-30,2012-02-29),(2012-01-30,2012-03-01)等。(闰年和非闰年)的日期往往集中在2月底左右,但类似的问题与其他月末日期(2011-05-31,2011-06-30)相似。 –

回答

1
DATEDIFF(m,{firstdate},ISNULL({seconddate},GETDATE())) - CASE 
                 WHEN DATEPART(d,{firstdate}) >= DATEPART(d,ISNULL({seconddate},GETDATE())) 
                 THEN 1 
                 ELSE 0 
+0

http://stackoverflow.com/questions/5131958/datediff-rounding – JBone

+0

原来已经有'>'你有'> ='的地方,这意味着如果每天的部分相等,DATEDIFF的结果仍然会降低另一件事是,计算“2011-03-31”和“2011-06-30”之间的日期差异。这个方法会返回'2',因为'31'的确大于'30'。但六月不能超过30天。那么在这种情况下'2个月'好吗? –

+1

好点。在这种情况下,它并不过分严格,但是在某些情况下,它可能是 – JBone

2

如果你想找到一些名义上的月数,为什么不找天差异,然后除以30(根据需要投到FLOAT)。也许30.5岁 - 取决于你想如何处理全年可变月份长度。但也许这不是你特定情况下的一个因素。

1

以下语句具有相同的startdate和相同的endate。这些日期相邻,并且在时间上有差异.0000001秒。每条语句中的开始日期和结束日期之间的差异跨越其日期部分的一个日历或时间边界。每个语句返回1. ...
SELECT DATEDIFF(month,'2005-12-31 23:59:59.9999999'
,'2006-01-01 00:00:00.0000000'); ....

(从DATEDIFF,部分日期部分边界)。如果你没有被它满意,你可能需要使用天为单位所提议的马丁·克莱顿

1

DATEDIFF是这样的设计。在评估特定的时间测量(如月,日等)时,只考虑测量值和较高的值 - 忽略较小的值。任何时间测量都会遇到这种情况。例如,如果您使用DATEDIFF计算天数,并且在午夜前几秒钟有一个日期,而在午夜几秒钟后有另一个日期,那么即使两个日期仅为几天,您也会得到“1”天的差异相隔数秒。

DATEDIFF是为了给一个粗略的答案的问题,像这样的:

问题:有多少岁是你吗? 答案:一些整数。你不会说“我59岁,4个月,17天,5小时,35分27秒”。你只是说“我59岁”。这也是DATEDIFF的做法。 (如你的儿子说:“我不是8!我是8和3分之一!,或者我是差不多 9!),那么,如果你想要一个适合某些上下文含义的答案你应该看看下一个最小的测量值并且与它近似,所以如果它是几个月后,那么可以在几天或几小时内做一个DATEDIFF,然后尝试接近几个月,但它看起来与你的情况最相关(也许你想要回答如1-1/2个月或1.2个月等)使用CASE/IF-THEN种逻辑

+0

如果你在12月和今天的1月份变成了32,那么你不会说你是33.然而DATEDIFF(YEAR)会说你是。 –

+0

@Andriy--这只是一个很好的例子。问题是,它没有被破坏 - 它只是为了给出粗略的答案。它有1(无论你使用什么测量)的加号或减号(误差界限)。 – Chains

+0

是的,我同意,它的设计是按照它的工作方式进行的。我同意DATEDIFF和人们都倾向于粗略地回答一些常见问题,其中大概是整数。只是DATEDIFF总是使用相同的规则,而人们却不这样做。有时候我们会围绕着,比如在*五十分钟的20分钟内,实际上只有十八分钟,而在其他时候,我们倾向于报告一整套完整的单位,没有任何舍入,就像年龄一样。我认为OP是想要的是后者,也就是获得结果的方式(也是一个整数),而不是舍入。 –