在SQL中与Datediff战斗

时间:2011-09-13 22:31:39

标签: sql datediff

我正在用SQL编写一个小查询,并且正在讨论一个似乎有人必须遇到的问题。我想找到两个日期之间的月数。我正在使用像...这样的表达式。

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

有没有人知道如何更多地找到两个日期之间的月份 - 所以基于时间超过时间超过月度阈值?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

以下语句具有相同的startdate和相同的endate。这些日期相邻,时间差异为.0000001秒。每个语句中startdate和endate之间的差异跨越其datepart的一个日历或时间边界。每个陈述都返回1. ...
  SELECT DATEDIFF(月,'2005-12-31 23:59:59.9999999'
   ,'2006-01-01 00:00:00.0000000'); ....

(来自DATEDIFF datepart Boundaries 部分)。如果您对此不满意,您可能需要按照 martin clayton 提出的天数作为单位

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

DATEDIFF旨在给出一个粗略的答案,例如:

问题:你多少岁了? 答:有些整数。你没有说“我是59岁,4个月,17天,5个小时,35分钟和27秒”。你只要说“我今年59岁”。这也是DATEDIFF的方法。

如果你想要一个适合某些情境意义的答案(比如你的儿子说“我不是8岁!我是8和4季!”或者我几乎 9 !),然后你应该看看下一个最小的测量并用它来近似。所以,如果它是你想要的几个月,然后在几天或几小时做一个DATEDIFF,并尝试近似几个月但是它似乎与你的情况最相关(也许你想要1-1 / 2个月或1.2个月等答案)使用CASE / IF-THEN种类的逻辑。