Sql server SQL Server:DATEDIFF不准确
我试图检索两个日期的月差,但似乎找不到获得准确月份的方法 以下是我到目前为止尝试的查询:Sql server SQL Server:DATEDIFF不准确,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我试图检索两个日期的月差,但似乎找不到获得准确月份的方法 以下是我到目前为止尝试的查询: 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'))
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将返回您编写的正确结果。正如您所看到的,它是指两个指定日期之间的月差
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函数,“两个日期之间的月数”是指从一个日期到下一个日期必须翻转的页面数。不管每个月有多少天,也不管是闰年
您不是第一个对内置函数的行为感到困惑的人。如果你需要用一种不同的方法来计算月份,那么你需要描述你想要完成的事情的细节。一旦定义了需要解决的问题,很可能很容易创建解决方案。在T-SQL中,您可以使用以下用例:
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,这是正确的。
Datediff
当日期边界(月
)跨越时计数。在使用Datediff
时,您需要小心。您的期望值是什么?我认为第二个值也应该将差值计算为1,然后减去0。它们都是一样的。这两个表达式对我来说都是0。你确定第二个结果是1吗?不管怎样,函数完全按照描述工作,现在由您来描述您想要的功能。@GiorgiNakeuri我希望得到准确的月份,考虑到所有可能的条件(闰年等)。hi@Greg感谢您的回答,考虑到这些数据,1992年2月1日和1992年3月1日,如果你计算的天数少于30天,但如果我们以月为单位来看,这被认为是一个月,今年是闰年是的,你能解释一下你的观点吗?就月数差异而言,为1。就daysPerMonths而言,如果您每月使用30天,那么它是0。当使用month作为datediff时,它会忽略日期。2月1日,2月18日,2月29日。。。按月份计算,2月份和3月份一样。因此,无论是哪一天,2月和3月之间的月差都是1。