我正在用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
有没有人知道如何更多地找到两个日期之间的月份 - 所以基于时间超过时间超过月度阈值?
答案 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种类的逻辑。