SQL Server 数据库服务器:DATEDIFF不准确

vc6uscn9  于 2022-11-21  发布在  其他
关注(0)|答案(4)|浏览(166)

我试图检索两个日期的月份差,但似乎找不到获得准确月份的方法。
以下是我到目前为止尝试的查询:

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。
还必须考虑闰年。

8gsdolmq

8gsdolmq1#

TSQL会返回您所编写的正确结果。它会采用指定的两个日期之间的月份差。

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,则此方法有效。

unftdfkk

unftdfkk2#

这里有一种方法可以直观地显示DATEDIFF(month, ...)正在做什么。想象一个挂在墙上的月历。对于这个特定的SQL函数来说,两个日期之间的“月数”是指从一个日期转到下一个日期所需的页数。每个月有多少天或者是否是闰年都无关紧要。
你不是第一个对内置函数的行为感到困惑的人。如果你需要用一种不同的方法来计算月份,那么你就需要描述你想要完成的具体任务。一旦你定义了需要解决的问题,很可能就很容易创建一个解决方案。

kkbh8khc

kkbh8khc3#

在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

它返回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

返回0,表示正确。

ibrsph3r

ibrsph3r4#

declare 
    @start date = '20220105',
    @end date = '20220406'

select 'Date_Diff_In_3 months' = 
    case 
     when datediff(month, @start, @end) < 3 
        or (datediff(month, @start, @end) = 3 and day(@start) >= day(@end))
        then 'yes' 
        else 'no' 
    end

相关问题