SQL 服务器:DATEDIFF 不准确

SQL Server : DATEDIFF not accurate

我正在尝试检索两个日期的月份差异,但似乎找不到获得准确月份的方法。

以下是我到目前为止尝试过的查询:

SELECT DATEDIFF(month,convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015')) - 1

这将导致 0,这是错误的,当我使用另一个日期时:

 SELECT DATEDIFF(month,convert(datetime, '12/31/2015'), convert(datetime, '01/01/2016')) - 1

这将产生正确的 0。

还必须考虑闰年。

TSQL return 是您编写的正确结果。正如您所拥有的,它正在计算指定的两个日期之间的月份差。

SELECT DATEDIFF(month, convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015'))

11 月和 12 月之间的月差为“1”。

但是,如果您希望每 30 天的差异为 1 个月,那么您需要重写查询:

declare @daysPerMonth int = 30
SELECT (DATEDIFF(day, convert(datetime, '11/05/2015'), convert(datetime, '12/06/2015')) / @daysPerMonth)

如果您将一个月中的天数定义为 30,则此方法有效。

这是一种可视化 DATEDIFF(month, ...) 正在做什么的方法。想想挂在墙上的月历。出于此特定 SQL 函数的目的,两个日期之间的月数 "number" 是从一个日期到下一个日期必须翻动的页数。每个月有多少天或是否是闰年都没有关系。

您不是第一个对内置函数的行为感到困惑的人。如果您需要用不同的方法计算月份,那么您需要描述您想要完成的具体内容。一旦您定义了需要解决的问题,很可能很容易创建解决方案。

在 T-SQL 中你可以使用 CASE:

SELECT DATEDIFF(month, convert(datetime, '11/05/2015'),
convert(datetime, '12/06/2015')) - 
CASE 
WHEN (MONTH('11/05/2015') > MONTH('12/06/2015') 
OR MONTH('11/05/2015') = MONTH('12/06/2015')
AND DAY('11/05/2015') > DAY('12/06/2015')) 
THEN 1 ELSE 0 
END

哪个 returns 1 哪个是正确的并且:


SELECT DATEDIFF(month, convert(datetime, '12/31/2015'),
convert(datetime, '01/01/2016')) - 
CASE 
WHEN (MONTH('12/31/2015') > MONTH('01/01/2016') 
OR MONTH('12/31/2015') = MONTH('01/01/2016')
AND DAY('12/31/2015') > DAY('01/01/2016')) 
THEN 1 ELSE 0 
END

哪个returns 0哪个是正确的。